본문 바로가기
Problem Solving/프로그래머스

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

by 청량리 물냉면 2023. 3. 11.
반응형
문제

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

 

반응형