[프로그래머스 | 파이썬 / 자바스크립트] [3차] 압축(2018 KAKAO BLIND RECRUITMENT/ level 2)

2023. 3. 11. 21:43·Problem Solving/프로그래머스
문제

https://school.programmers.co.kr/learn/courses/30/lessons/17684

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🐍파이썬
def solution(msg):
    answer = []
    dic = {chr(i+ord("A")-1):i for i in range(1, 27)}
    idx = 27
    checkMsg = ""	#w
    for i in msg:
        checkMsg += i	#w+c
        if checkMsg not in dic:
            answer.append(dic[checkMsg[:-1]])
            dic[checkMsg] = idx
            idx += 1
            checkMsg = checkMsg[-1]
    answer.append(dic[checkMsg])
    return answer

1️⃣ 컴프리헨션을 통해 {"A":1, "B":2, ..., "Z":26} 의 dictionary를 생성한다.

2️⃣ checkMsg에 msg의 글자 하나를 추가한다. checkMsg가 dic에 존재하면 바로 다음 글자를 checkMsg에 덧붙인다.

3️⃣ checkMsg가 dic에 존재하지 않으면 글자를 추가하기 이전까지의 단어 인덱스(현재 입력된 문자열과 일치하는 가장 긴 문자열)를 dic에서 찾아 추가한다.

4️⃣ checkMsg+추가한 글자가 사전에 존재하지 않는 상태이기 때문에, 이 문자열을 사전에 추가하고 다음에 올 원소를 위해 인덱스를 하나 늘린다.

5️⃣ checkMsg값은 checkMsg의 마지막 글자로 초기화한다.

6️⃣ for문이 종료된 후 checkMsg에 저장된 마지막 글자의 인덱스를 dic에서 찾아 answer에 추가한다.

(참고한 풀이: https://e-you.tistory.com/123)

 

 

다른 풀이 방법

def solution(msg):
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    d = {k:v for (k,v) in zip(alphabet, list(range(1,27)))}
    answer = []
    while True:
        if msg in d:    #처리되지 않은 글자 처리
            answer.append(d[msg])
            break
        for i in range(1, len(msg)+1):
            if msg[0:i] not in d:	#msg[0:i]가 사전에 없다면
                answer.append(d[msg[0:i-1]])	#한 글자 이전의 문자열을 answer에 추가
                d[msg[0:i]] = len(d)+1	#msg[0:i]를 사전에 등록
                msg = msg[i-1:]	#answer에 등록된 문자열은 입력에서 삭제 
                break
    return answer

 

 

🐥자바스크립트
function solution(msg) {
    var answer = [];
    let dic = {};
    for(let i = 1; i <= 26; i++){
        dic[String.fromCodePoint(64+i)] = i
    }
    let checkMsg = "";
    let idx = 27;
    for(let i of msg){
        checkMsg += i;
        if(Object.keys(dic).includes(checkMsg) === false){
            answer.push(dic[checkMsg.slice(0, checkMsg.length -1)]);
            dic[checkMsg] = idx
            idx += 1
            checkMsg = checkMsg[checkMsg.length-1];
        }
    }
    answer.push(dic[checkMsg]);
    return answer;
}

파이썬 풀이와 동일하게 풀었다.

1️⃣ {"A":1, "B":2, ..., "Z":26} 의 dictionary를 생성한다.

2️⃣ checkMsg에 msg의 글자 하나를 추가한다. checkMsg가 dic에 존재하면 바로 다음 글자를 checkMsg에 덧붙인다.

3️⃣ checkMsg가 dic에 존재하지 않으면 글자를 추가하기 이전까지의 단어 인덱스(현재 입력된 문자열과 일치하는 가장 긴 문자열)를 dic에서 찾아 추가한다.

4️⃣ checkMsg+추가한 글자가 사전에 존재하지 않는 상태이기 때문에, 이 문자열을 사전에 추가하고 다음에 올 원소를 위해 인덱스를 하나 늘린다.

5️⃣ checkMsg값은 checkMsg의 마지막 글자로 초기화한다.

6️⃣ for문이 종료된 후 처리되지 않은 마지막 글자의 인덱스를 dic에서 찾아 answer에 추가한다.

 

 

💡 참고

1. fromCodePoint()

자바스크립트 아스키코드➡문자 변환

 

2. 객체에 특정 키(속성)가 존재하는지 확인하는 방법

https://leftday.tistory.com/81

 

자바스크립트 - 객체에 특정 키(속성)가 존재하는지 확인하는 방법

중괄호 {} 로 된 자바스크립트 객체에서 키를 찾는 방법은 Object 의 keys 사용, key in Object 활용 그리고 hasOwnProperty를 사용하는 방법이 있습니다. 자바스크립트 키 확인 방법 자바스크립트를 이용하

leftday.tistory.com

 

3. 문자열 자르기

https://gent.tistory.com/414

 

[JavaScript] 문자열 자르기 (substr, substring, slice)

자바스크립트에서 문자열을 자르기 위해서는 substr(), substring(), slice() 함수를 사용하면 된다. 문자열을 뒤에서부터 자르기 위해서는 slice() 함수를 사용하면 효율적이며 타 언어의 Right 함수와 비

gent.tistory.com

 

 

다른 풀이 방법

function solution(msg) {
    var list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    var dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})
    var result = [];
    var maxLen = 1;
    for (var i = 0; i < msg.length; i++) {
        var w = msg[i];	//현재 입력
        var c = msg[i+1];	//다음 글자
        //w+c가 존재하고 i가 msg길이-1보다 작을 때(msg[i+1]이 인덱스 범위를 벗어나지 않게 처리)
        while (dic[w+c] && i < msg.length - 1) {
            i++;
            w = w+c;	//일치하는 가장 긴 문자열
            c = msg[i+1];	//현재 글자의 다음 글자를 가리킴
        }
        result.push(dic[w]);	//정답 배열에 문자열 인덱스 추가
        list.push(dic[w+c]);
        dic[w+c] = list.length;	//사전에 새로운 문자열 추가
    }
    return result;
}
var dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})

초기값을 dictionary로 만들고 사전에 (현재 원소값:인덱스+1)을 저장하여 {"A":1, "B":2, ..., "Z":26} 형태의 dictionary를 생성한다.

 

💡 참고

reduce 활용(https://www.zerocho.com/category/JavaScript/post/5acafb05f24445001b8d796d)

 

https://www.zerocho.com/category/JavaScript/post/5acafb05f24445001b8d796d

 

www.zerocho.com

 

저작자표시 비영리 변경금지 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[프로그래머스 | 파이썬 / 자바스크립트] [3차] 파일명 정렬(2018 KAKAO BLIND RECRUITMENT / level 2)  (0) 2023.03.15
[프로그래머스 | 파이썬 / 자바스크립트] 덧칠하기(연습문제 / level 2)  (0) 2023.03.12
[프로그래머스 | 파이썬 / 자바스크립트] 겹치는 선분의 길이(코딩테스트 입문/ level 0)  (0) 2023.03.12
[프로그래머스 | 파이썬 / 자바스크립트] 롤케이크 자르기(연습문제/ level 2)  (0) 2023.03.11
[프로그래머스 | 파이썬 / 자바스크립트] 영어가 싫어요(코딩테스트 입문/ level 0)  (0) 2023.03.10
[프로그래머스 | 파이썬 / 자바스크립트] 오픈채팅방(2019 KAKAO BLIND RECRUITMENT/ level 2)  (2) 2023.03.06
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 | 파이썬 / 자바스크립트] 덧칠하기(연습문제 / level 2)
  • [프로그래머스 | 파이썬 / 자바스크립트] 겹치는 선분의 길이(코딩테스트 입문/ level 0)
  • [프로그래머스 | 파이썬 / 자바스크립트] 롤케이크 자르기(연습문제/ level 2)
  • [프로그래머스 | 파이썬 / 자바스크립트] 영어가 싫어요(코딩테스트 입문/ level 0)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 프로그래밍
        • Programming
        • C | C++
        • Java
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    bfs
    클론 프로젝트
    알고리즘
    spring boot
    Til
    React
    프로그래머스
    리액트
    백준
    자바
    ZeroCho
    mysql
    파이썬
    웹사이트
    타입스크립트
    구현
    Jiraynor Programming
    d3
    컴퓨터네트워크
    블로그 제작
    SWEA
    포트폴리오
    프로젝트
    플러터
    AWS
    자바스크립트
    뉴렉처
    강의내용정리
    공식문서
    Next.js
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[프로그래머스 | 파이썬 / 자바스크립트] [3차] 압축(2018 KAKAO BLIND RECRUITMENT/ level 2)
상단으로

티스토리툴바