문제 링크
https://programmers.co.kr/learn/courses/30/lessons/17684
풀이 전략
1. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
3. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
4. 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.
문제에서 말하는 그대로 구현하면 되는 문제이다.나는 너무 어렵게 생각하여 한참을 돌아갔다.
코드
function solution(msg) {
const answer = [];
const dict = new Map();
let idx = 0;
while (idx < 26) {
dict.set(String.fromCharCode(idx + 65), idx);
idx++;
}
for (let i = 0; i < msg.length; i++) {
let str = "";
let add = i;
str += msg[i];
while (dict.has(str)) {
add++;
if (add === msg.length) break;
str += msg[add];
}
if (add === msg.length) answer.push(dict.get(str) + 1);
else answer.push(dict.get(str.slice(0, -1)) + 1);
dict.set(str, idx++);
i = add - 1;
}
return answer
}
회고
도움받은 블로그
w와 c를 하나의 str에 담으려다 보니, 문제에서 많이 헤맸다. 처음부터 따로 설정하였다면str.slice(0, -1) 그리고 add = msg.length
와 같은 코드는 적지 않았을 것 같다.
풀이의 기본전략은 dict를 만들어 이 dict에 값이 존재하지 않을때까지 while문을 돌린 뒤 str을 dict에 추가하고 하나를 제거한 문자열을의 값을 answer배열에 추가하는 방식이다.
하지만 기본적으로 str에 msg[i]를 더하는 방식이다 보니 맨끝으로 넘어가는 상황이 발생하여서 임시방편으로
if(add == msg.length) break;
와 같은 코드를 적다 보니 문제를 풀긴 하였지만 썩 마음에 들지 않는다. 문제를 푼 후 다른 분들의 코드를 참고하였는데, 정말 간결하게 잘 푸신 분들이 많아서 배울 수 있었다. 내 코드는 문제를 만나면 그것에 집중하여 피해나가는 식이라면 다른 분들은 애초에 설계할 때 부터 이 문제를 예상하고 작성에 들어가신 것 같았다. 스킬체크에서 만난 문제였는데, 조금 더 쉽게 풀 수 있지 않았을까 싶다.
더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)
'Algorithm > 프로그래머스[Programmers]' 카테고리의 다른 글
[JS] 2020카카오 : 수식 최대화 프로그래머스 LEVEL2 (0) | 2022.06.22 |
---|---|
[JS] 2020카카오 : 괄호 변환 프로그래머스 LEVEL2 (0) | 2022.06.21 |
[JS] 2019카카오 : 오픈 채팅방 프로그래머스 LEVEL2 (0) | 2022.06.20 |
[JS] 2021카카오 : 메뉴 리뉴얼 프로그래머스 LEVEL2 (0) | 2022.06.18 |
[JS] 2021카카오 : 거리두기 확인하기 프로그래머스 LEVEL2 (0) | 2022.06.10 |
댓글