[프로그래머스][JS]압축

Kyle·2021년 1월 1일
0

problem solving

목록 보기
24/36

압축

문제

문제: https://programmers.co.kr/learn/courses/30/lessons/17684?language=javascript

해결방법

  1. initKey: 위의 사진처럼 기본 keyObj 초기화해준다. (아스키코드 이용)

  2. msg를 앞에서부터 character을 순회하면서 진행한다.

    slice하는 구간을 한칸씩 늘려가면서 keyObj에 있는지 체크한다.

    • const nowStr = msg.slice(i, i + sliceNum).join('')
      nowStrkeyObjkey배열에 있는지 확인해 있는지 없는지 확인한다.
  • keyObj의 key배열에 있는 경우
    한칸더 늘려서 확인해야 되기 때문에 sliceNum++해서 반복한다.

  • keyObj의 key배열 없을 경우
    keyObj에 현재 slice값을 저장, isliceNum과 비교해 추가해준다.
    - (만약 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년 첫 번째 알고리즘이다.
앞으로도 쉬운문제든 어려운문제든 꾸준하게만 진행하자

profile
Kyle 발전기

0개의 댓글