-
[CodeKata] 프로그래머스 : 4.7(수), 압축Algorithm 2021. 4. 8. 19:46반응형
🥋 Ooooth!! (Level 2)
우선 문자열을 잘라가는데, 이는 사전에 해당 문자열이 포함되어있어야 한다는 기준을 고려해야 한다.
KAKAO를 자르기 시작하면, KA는 사전에 포함되어있지 않으므로 그 전까지인 K의 인덱스를 정답배열에, KA는 사전의 새로운 요소로 추가해주면 된다.
위 일련의 처리가 끝나면, 그 다음부터인 A에서 시작하여, AK, AKA... 순으로 검색하면 된다.
(여기서도 AK가 사전에 없으므로 멈추게 되겠지)
🧮 풀이
function solution(msg) { let answer = []; let dic = Array.from({ length: 27 }, (_,i) => String.fromCharCode(i+64)) let s = 0; let e = 1; while (true) { const key = msg.substring(s,e) if (e === msg.length + 1) { answer.push(dic.indexOf(key)) break; } else if (!dic.includes(key)) { answer.push(dic.indexOf(key.slice(0, -1))) dic.push(key) s = e-1; } else { e++; } } return answer; }
- answer는 우리가 반환할 정답이자, 인덱스들이 담겨있는 배열이다.
- dic은 알파벳을 사전으로 저장한 배열이다. 각 요소는 인덱스와 fromCharCode 아스키코드 함수로 알파벳을 저장했다.
- s, e는 msg 문자열을 자르기 위한 시작과 끝 인덱스이다.
- 다음으로, while 반복문을 반복한다. 조건은 true로, 내부에서 break 조건을 걸었다. key는 s,e로 자른 msg의 문자열이다.
- 마지막 else는 answer 추가나 반복종료의 조건이 아닌 경우이다. 이 때는, e++ 증가시키며 문자열(key)을 연장한다.
- else if는 answer 추가조건이다. 현재 key가 dic에 없으므로, 끝값을 자른 문자(slice(0,-1)의 dic 인덱스를 answer에 추가한다.
- 또한, dic에 새롭게 key 요소를 추가해준다. 다시, 바로 전 인덱스부터 잘라야 하므로 시작 인덱스(s)를 e-1로 업데이트한다.
- e가 msg.length+1 과 같아지면 msg 문자열 끝에 도달한 경우다. 이 때는, 마지막 key를 처리하고 break 로 종료시켜준다.
🖇 리뷰
처음에는 각 문자를 배열로 변환해서 풀어보았지만, 아무래도 push, shift, join 동작들이 반복되며 효율성에 문제가 있었다.
또, 알고리즘 외 TMI를 읊자면... 요즘 주니어 프론트로 첫 취업을 위한 면접을 보면서 포스팅이나 알고리즘을 많이 못 하고 있다.
남은 Level2를 간간히 마무리시키고, 당분간 취업에 매진할 생각이다!
이후부터는 Level3를 풀면서 더 심화된 알고리즘과 개념들을 학습하면서 문제들을 클리어해나갈 계획이다!!!
반응형'Algorithm' 카테고리의 다른 글
[CodeKata] 프로그래머스 : 4.21(수), n진수 게임 (0) 2021.04.21 [CodeKata] 프로그래머스 : 4.20(화), 파일명 정렬 (0) 2021.04.20 [CodeKata] 프로그래머스: 4.1(목), 방금그곡 (0) 2021.04.03 [CodeKata] 프로그래머스: 3.29(월), 후보키 / [이론] 비트 연산자 (0) 2021.03.29 [CodeKata] 프로그래머스: 3.27(토), 오픈채팅방 (0) 2021.03.28