코딩테스트

[JS] [3차] 압축

미안하다 강림이 좀 늦었다 2023. 12. 26. 23:04

 

 

난이도: Lv. 2

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

 

프로그래머스

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

programmers.co.kr

 

 

알고리즘

1. 사전에 존재하지 않는 단어가 나올때까지 문자를 계속 추가한다.

2. 사전에 존재하지 않는 단어가 나오면 마지막 문자를 제외한 문자열의 사전 색인 번호를 정답 배열에 추가하고, 사전에도 추가한다.

3-1. 주어진 문자열의 마지막 문자를 포함한 문자열이 사전에 존재하는 경우의 예외 처리 (j === msg.length - 1 부분)

3-2. 주어진 문자열의 마지막 문자만 남은 경우의 예외 처리 (i === msg.length - 1 부분)

 

 

코드

function solution(msg) {
    var answer = [];
    let index = 27;
    const dictionary = {};

    for (let i = 1; i <= 26; i++)
        dictionary[String.fromCharCode(64 + i)] = i;

    for (let i = 0; i < msg.length;) {
        for (let j = i + 1; j < msg.length; j++) {
            const substr = msg.substring(i, j + 1);

            if (Object.hasOwn(dictionary, substr)) {
                if (j === msg.length - 1) {
                    answer.push(dictionary[substr]);
                    i = msg.length;
                    break;
                }
            }
            else {
                answer.push(dictionary[msg.substring(i, j)]);
                dictionary[substr] = index++;
                i = j;
                break;
            }
        }
        if (i === msg.length - 1) { answer.push(dictionary[msg[i]]); break; }
    }

    return answer;
}

 

 

주저리

고난이 너무 많았어서 할 말도 다 까먹었다. 처음부터 그냥 while문 썼으면 나았을 것 같은데 굳이굳이 for문 쓰다가 문제를 한참 풀었다. 마지막 고난만 기억 나는데 주어진 문자열의 길이가 1인 경우 undefined가 나와서 코드를 조금 바꿨다.