프로그래머스 - 3차 압축

front_pica·2021년 5월 16일
0

문제


풀이과정

  1. 각 단어의 색인 번호가 저장된 배열과 주어진 단어를 쪼갠 split배열을 만든다.
  2. 각 split된 글자를 순회하면서 그 단어가 색인 배열에 있으면 tempStr에 단어를 붙이며 계속 이어나간 다음 없을때까지 반복한다.
  3. 이렇게 나온 tempStr에는 색인배열에 없는 단어이므로 추가시킨다음 그 인덱스번호를 answer배열에 넣고 다음 단어를 진행시킨다.
  4. 이렇게 다 순회하고 나면 결과적으로 색인번호로만 주어진 answer배열이 완성된다.

코드

function solution(msg) {
  const strArr = msg.split("");
  //색인배열 1부터 시작이라서 0번째는 아무 문자나 집어넣었다.
  const indexArr = [
    '@','A','B','C','D','E','F','G',
    'H','I','J','K','L','M','N',
    'O','P','Q','R','S','T','U',
    'V','W','X','Y','Z'
  ]
  const answer = [];

  //카운팅을 해줄 변수
  let index = 0;
  //색인배열에 들어갈 문자열
  let tempStr = "";
  //for문이 별탈없이 끝까지 진행되었는가 -> 끝부분단어를 색출하는 변수
  let isEnd = true;

  while(index < strArr.length) {
    for(let i = index; i < strArr.length ; i ++) {   
      tempStr += strArr[i];
      if(!indexArr.includes(tempStr)) {
        isEnd = false;
        break;
      }
    }

    //끝부분이 색출되면 그 단어를 그대로 push하고 while문을 종료
    if(isEnd) {
      answer.push(indexArr.indexOf(tempStr));
      break;
    }

    //기존에 주어진 색인에 있는 단어
    if(tempStr.length === 2) {
      answer.push(indexArr.indexOf(tempStr[0]));
      index++;
      indexArr.push(tempStr);
      
    //기존에서 추가된 색인에 있는 단어
    } else {
      answer.push(indexArr.indexOf(tempStr.slice(0, tempStr.length - 1)));
      index = parseInt(index) + parseInt(tempStr.length - 1);
      indexArr.push(tempStr);
    }

    tempStr = "";
    isEnd = true;
  }

  return answer;
}

풀면서 막혔던 부분은
끝부분에 색출될때 예외처리를 해주는 생각이 바로 떠오르지 않아 잠시 고민했지만 변수를 추가하여서 그 여부를 판단하여 처리하였다.

profile
한걸음씩

0개의 댓글