[프로그래머스][JS]압축
압축
문제
문제: https://programmers.co.kr/learn/courses/30/lessons/17684?language=javascript
해결방법
-
initKey
: 위의 사진처럼 기본 keyObj 초기화해준다. (아스키코드 이용) -
msg
를 앞에서부터 character을 순회하면서 진행한다.slice
하는 구간을 한칸씩 늘려가면서keyObj
에 있는지 체크한다.const nowStr = msg.slice(i, i + sliceNum).join('')
nowStr
이keyObj
의 key배열에 있는지 확인해 있는지 없는지 확인한다.
-
keyObj의 key배열에 있는 경우
한칸더 늘려서 확인해야 되기 때문에sliceNum++
해서 반복한다. -
keyObj의 key배열 없을 경우
keyObj
에 현재 slice값을 저장,i
를sliceNum
과 비교해 추가해준다.
- (만약 2글자 짜리가 저장 됐다면, i+2 해줘야되기 때문에 for문 초기화구문에서 처리하는것이 아닌 아래에서 따로 적용해줬다.) -
추가고려 사항
i + sliceNum
값과msg.length
비교도 해줘야한다.
ex)KAKAO 에서 i=4 일 경우, msg[i]='O' 이고 sliceNum이 1,2,3,4 계속 커져도const nowStr = msg.slice(i, i + sliceNum).join('')
값은 계속해서 'O'이다 (뒤의 값이 없기 때문) ==> while 무한루프
code
function solution(msg) {
let answer = [];
msg = msg.toUpperCase().split('');
const keyObj = initKey();
let keyLastValue = keyObj['Z'];
for (let i = 0; i < msg.length; ) { //i++는 아래 구문해서 해준다.
let sliceNum = 1;
let strValue; //keyObj에 있는 값 (아래 if문 통과 한 값)
while (true) {
const nowStr = msg.slice(i, i + sliceNum).join('');
if (Object.keys(keyObj).includes(nowStr) && i + sliceNum <= msg.length) {
strValue = keyObj[nowStr];
sliceNum++;
} else {
answer.push(strValue);
keyLastValue++;
keyObj[nowStr] = keyLastValue;
i += sliceNum - 1;
break;
}
}
}
return answer;
}
function initKey() {
const keyObj = {};
for (let i = 1; i <= 26; i++) {
keyObj[String.fromCharCode(i + 64)] = i;
}
return keyObj;
}
마무리
2021년 첫 번째 알고리즘이다.
앞으로도 쉬운문제든 어려운문제든 꾸준하게만 진행하자
Author And Source
이 문제에 관하여([프로그래머스][JS]압축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@proshy/프로그래머스JS압축저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)