프로그래머스/구현
[문자열] 프로그래머스 '압축' - js
bbeyak
2023. 4. 6. 23:29
반응형
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;
}
반응형