입력으로 영문 대문자로만 이뤄진 문자열 msg가 주어진다. msg의 길이는 1 글자 이상, 1000 글자 이하이다.
주어진 문자열을 압축한 후의 사전 색인 번호를 배열로 출력하라.
function solution(msg) {
const answer = [];
let nextWord = "";
let lastCount = 27;
const dir = {
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
};
const s = msg.split("").reduce((acc, cur) => {
nextWord = acc + cur;
if (dir[nextWord] === undefined) {
dir[nextWord] = lastCount++;
} else {
return acc + cur;
}
if (dir[acc] !== undefined) answer.push(dir[acc]);
return cur;
});
answer.push(dir[s]);
return answer;
}
`msg.split("").reduce(...)`: 문자열을 순회
msg
를 압축
answer
: 최종적으로 반환할 압축된 숫자들을 저장하는 배열nextWord
: 현재까지 읽은 메시지에서 다음에 읽을 문자열을 저장하는 변수dir
: 알파벳에 대응하는 숫자를 저장하는 객체 A부터 Z까지의 알파벳을 키로 가지고 있고 각 알파벳에 해당하는 숫자가짐msg.split("").reduce(...)
: 문자열을 순회
1.nextWord
에 현재까지 읽은 문자열을 더하고, 만약 해당 단어가 dir에 없다면 새로운 단어로 인식하고dir
에 추가
- 이미 존재하는 단어라면 현재까지 읽은 부분을 반환
dir[acc] !== undefined
일 때, 이미 존재하는 단어인 경우 해당 단어에 대응하는 숫자를answer
배열에 추가
현재 문자를 반환하여 다음 반복에 사용
- 반복이 끝나면 마지막으로 남은
s
에 해당하는 숫자를 dir에서 찾아서 answer에 추가