본문 바로가기

프로그래머스/구현

[문자열] 프로그래머스 '압축' - js

반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

2. 코드

다른 좋은 방법들도 많겠지만, 나는 dic이라는 사전 객체를 먼저 만들어주고 시작했다.

현재 단어(w) + 다음 단어(c)가 사전에 없으면 현재 단어의 색인 번호를 answer에 push하고 현재 단어(w)+ 다음 단어(c)를 사전에 넣는다. 이때 색인 번호는 사전에 있는 마지막 단어의 색인 번호 +1이다. 

만약 현재 단어(w) + 다음 단어(c)가 사전에 있다면 사전에 없을 때까지 다음 단어들을 더해준다. 계속 더해주다가 마침내 사전에 없는 단어가 완성되었을 때, 앞의 방법과 마찬가지로 단어를 넣는다. 

while 문의 탈출조건이 msg의 길이가 0일 경우이므로 위의 두 가지 경우 모두 사전에 단어를 넣은 후, 넣은 단어는 splice를 통해 msg에서 제거하고 마지막 단어의 색인 번호를 저장하는 last에 +1을 해준다. 

두 가지 경우에 해당하는 로직을 실행하였으면 다음 단어 처리를 위해 w 값을 msg의 첫번째 단어로 재할당한다.

function solution(msg) {
    let answer = [];
    msg = msg.split('');
    const dic = {"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 w = msg[0];
    let last = 26;
   
    while(msg.length){
        if(!((w + msg[1]) in dic)){
            answer.push(dic[w]);
            msg.splice(0,1);
            dic[w + msg[0]] = last + 1;
            last ++;
        }else{
            for(let i=1;i<msg.length;i++){
              if((w + msg[i]) in dic) w += msg[i];
              else break;
            }
            answer.push(dic[w]);
                msg.splice(0,w.length);
                dic[w + msg[0]] = last + 1;
                last ++;
        }
        w = msg[0];
    }
    
    return answer;
}
반응형