문제: 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 무한루프
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년 첫 번째 알고리즘이다.
앞으로도 쉬운문제든 어려운문제든 꾸준하게만 진행하자