나의 풀이
function solution(msg) {
const result = matchAlphabet(msg);
return result;
}
function matchAlphabet(string, result = [], alphabetIndex = GenerateAlphabetIndex()) {
if (alphabetIndex.has(string)) {
result.push(alphabetIndex.get(string));
return result;
}
let index = 0;
let hasIndex;
do {
index += 1;
hasIndex = alphabetIndex.has(string.slice(0, index));
} while (hasIndex);
alphabetIndex.set(string.slice(0, index), alphabetIndex.size + 1);
result.push(alphabetIndex.get(string.slice(0, index - 1)));
return matchAlphabet(string.slice(index - 1), result, alphabetIndex);
}
function GenerateAlphabetIndex() {
const alphabetArray = GenerateAlphabet();
const alphabetIndex = new Map();
alphabetArray.forEach((alphabet, index) => {
alphabetIndex.set(alphabet, index + 1);
});
return alphabetIndex;
}
function GenerateAlphabet() {
let startIndex = 65;
const sample = Array.from({ length: 26 }, () => {
let alphabet = String.fromCharCode(startIndex);
startIndex += 1;
return alphabet;
});
문제를 푸는데 많은 시간이 걸렸다.
그렇게 어려운 문제는 아니였는데 계속 reduce라는 틀안에 놓고 풀려고하니 풀리지가 않았다.
해서 재귀로 바꾸었다.
msg도 1000글자 이하이기 때문에 큰 지장이 없을 것이라고 생각했다.
여기서 더 리팩터링을 해봐야할 것 같다.
일단 맨 아래 두개의 Generate함수는 { A : 1, B:2 .... } 를 만들기 위한 함수이다.
알파벳도 A - Z까지 다 쓰기 싫었고 심지어 INDEX까지 추가해주는 거는 더 싫었다.
해서 함수를 만들었다.
여기서의 핵심은 Map을 사용하였다.
그냥 일반 객체를 사용하면 data를 다루기가 복잡해지기도 하고 중복을 허용하지 않기에 Map을 사용할 수 있는 조건이 되었다.
이렇게 풀면 안된다.
function solution(msg) {
const alphabetIndex = GenerateAlphabetIndex()
let pass = false
const sample = [...msg].reduce((acc,cur,index,arr) => {
const hasIndex = alphabetIndex.has(cur)
if(pass) {
pass = false
return acc
}
if(hasIndex) {
if(alphabetIndex.has(cur + arr[index + 1])) {
acc.push(alphabetIndex.get(cur + arr[index + 1]))
pass = true
return acc
}
alphabetIndex.set(cur+ arr[index + 1], alphabetIndex.size + 1)
acc.push(alphabetIndex.get(cur))
return acc
}
alphabetIndex.set(cur+ arr[index + 1], alphabetIndex.size + 1)
return acc
},[])
return sample
}
function GenerateAlphabetIndex() {
const alphabetArray = GenerateAlphabet()
const alphabetIndex = new Map()
alphabetArray.forEach((alphabet,index) => {
// alphabetIndex[alphabet] = index + 1
alphabetIndex.set(alphabet,index+1)
})
return alphabetIndex
}
function GenerateAlphabet() {
let startIndex = 65
const sample = Array.from({length:26}, () => {
let alphabet = String.fromCharCode(startIndex)
startIndex += 1;
return alphabet
})
return sample
}
// 영문 대문자만 처리
다른 사람 풀이
function solution(msg) {
var 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']
var dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})
var result = [];
var maxLen = 1;
for (var i = 0; i < msg.length; i++) {
var w = msg[i];
var c = msg[i+1];
while (dic[w+c] && i < msg.length - 1) {
i++;
w = w+c;
c = msg[i+1];
}
result.push(dic[w]);
list.push(dic[w+c]);
dic[w+c] = list.length;
}
return result;
}
dic만드는 방법 깔끔하고 너무 좋은 것 같다.
나도 다음에 써먹어야겠다.
전체적인 로직도 단순해서 이렇게 비슷하게 풀어봐야겠다.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스 - JS] level.2 주차 요금 계산 (0) | 2023.01.02 |
---|---|
[프로그래머스 - JS] level.2 귤 고르기 (0) | 2022.12.31 |
[프로그래머스 - JS] level.2 k진수에서 소수 개수 구하기 (0) | 2022.12.26 |
[프로그래머스 - JS] level.2 프린터 (0) | 2022.12.23 |
[프로그래머스 - JS ] level.2 [1차] 뉴스 클러스터링 (ing) (0) | 2022.11.02 |