https://programmers.co.kr/learn/courses/30/lessons/17684
무손실 압축 알고리즘을 이용해 사전에 문자를 추가하고 그 번호를 반환해라
필자가 푼 문제풀이
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;
}
문자열을 이어붙이고 비교하는 것을 보니 딱 reduce연산자가 생각이 났다.
필자는 먼저 알파벳을 키값으로 한 객체를 만든 후
1. 현재 글자와 다음 글자를 더한 부분이 사전에 있는지 비교
2. 없다면 사전에 추가 있다면 다음 현재 글자를 합친 글자로 return
3. 그 다음 순번에 그 글자가 사전에 있다면 그 번호를 정답 배열에 추가해주었다.
⭐ 지금 만들어둔 reduce연산자에는 마지막에 현재 글자를 리턴하면서 끝이 나기 때문에 변수에 담아 제일 끝에 정답 배열에 저장해 두어야 한다.
const list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
const dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})
다른 사람의 풀이에서 알파벳이 들어있는 사전 객체를 reduce를 이용해 만들 수도 있다라는 것을 알게 되었다.
reduce는 역시 사용법이 무궁무진하다고 생각된다. bb
2022.02.15