개발 공부/알고리즘 문제 풀이

[프로그래머스] [3차] 압축 (JavaScript)

종범2 2020. 6. 7. 00:09

문제

프로그래머스 2018 KAKAO BLIND RECRUITMENT [3차] 압축

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

 

코딩테스트 연습 - [3차] 압축

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

언어

바스크립트(JavaScript)

 

접근 방법

  1. key라는 객체를 정의하고 단어를 key, 색인 번호를 value로 설정한다.
  2. msg 문자열에서 i 번째 문자열을 w로 i+1 번째 문자열을 c로 두고 재귀 함수를 실행한다.
  3. 재귀 함수에서 w+c가 사전에 있으면 그 w+c를 w로 두고 c를 그다음 단어로 두고 함수를 재귀적으로 다시 실행한다.
  4. 재귀 함수에서 w+c가 사전에 없으면 key에 w+c, value를 다음 색인 번호인 속성을 추가하고 w를 반환한다.
  5. 반환된 문자 w의 색인 번호를 추가하고 w의 길이만큼 건너뛰도록 i에 크기를 더한다.

코드

const key = {
    'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,
    'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19, 'T':20,
    'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26
}
let idx = 27;
function solution(msg) {
    let answer = [];
    for (let i=0; i<msg.length; i){
        let w = msg[i];
        let c = msg[i+1];
        let newW = add(msg,i,w,c,0);
        // 반환된 문자 w의 색인 번호를 추가하고
        // w의 길이만큼 건너뛰도록 i에 크기를 더한다
        answer.push(key[newW]);
        i += newW.length;
    }
    return answer;
}
function add(msg,i,w,c,cnt){
    // w+c가 사전에 있으면 그다음 단어를 붙어 다시 확인하고
    // w+c가 사전에 없으면 사전에 추가하고 문자 w를 반환한다
    if (key[w+c] === undefined){
        key[w+c] = idx++;
        console.log(w,c,key[w], key[w+c])
        return w;
    }else{
        cnt++;
        let newW = w+c;
        let newC = msg[i+1+cnt];
        return add(msg,i,newW,newC,cnt);
    }
}

복기

  1. 재귀 함수를 자유롭게 사용할 줄 알아야한다.
  2. 재귀 함수를 호출할 때 return을 붙이는 경우가 많다. return을 의도치 않게 빼먹는 경우를 조심하자.