본문 바로가기
일반 학습/코딩 테스트

[프로그래머스] 압축

by StelthPark 2022. 3. 10.

처리조건

풀이

입력 : "KAKAO"

입력된 문자열에서 인덱스 별로 최대 길이를 붙여가면서 사전에 있는 단어 있는지 검색하게 되는데 우선 사전을 알파벳A부터 Z까지 만들어야해서 객체를 생성하여 'A':1~'Z':26까지 넣어주게 된다. 하드코딩으로 하나하나 넣어줘도 되지만 아스키코드로 A-Z까지 돌려 객체를 생성하였다.

 

KAKAO에서 K부터 검사한다. 사전에K가 있다. KA를 검사한다. KA는 없다 그렇다면 사전의 끝번호, 현재는 Z까지니 26 다음인 키를 KA로 밸류를 27로 넣어주게 된다. 이렇게 인덱스별로 계속 붙여 검사하다가 사전에 없는 단어까지가게 되면 그 단어를 객체에 이전까지 저장된 벨류+1를 하여 저장시킨 뒤 사전에 없는 단어 전까지의 단어를 현재 검사중인 문자열에서 제거하게 되며 제거한 문자를 사전에서 찾아 밸류값을 푸시해주면 된다. 마지막까지 검사하면서 만약에 사전에 없는 단어가 나오지 않는 다면 해당하는 문자를 사전에서 찾아 밸류를 푸시하고 현재 검사중인 단어를 빈문자로 만들어 while문의 break조건에 걸리게된다.

 

문제를 풀면서 우선 입출력예제를 확인하며 처리되는 순서를 잘 파악해야했다. 어떻게 색인번호가 나오게 되는지 잘 확인해야한다.

 

While문안에서 빈문자열을 add로 잡는다. 자, 이제 검색할 단어 nowString을 길이만큼 for문을 돌려 add에 한단어씩 추가한다. 추가하다보면 사전에 없는 단어가 조합될 것이다. 그렇다면 if문에서 걸린다. 그 없는 단어를 dic이라는 사전에 key와 밸류는 이전 27부터이니 count로 지정하고 다음 dic에 추가될 단어를 위해 count를 ++ 한다. 이후 현재 조합한 단어의 전 까지의 단어를 색인번호 배열인 result에 push한다. 그리고 검색중인 nowString에서 색인으로 넣은 단어를 빼주기 위해 split splice join을 거쳐 다시 할당한다. 그리고 더이상 작업이상 추가적인 작업을 막기 위해 break하여 for문을 벗어나 다시 while문으로 돌아온다. 여기서 식곤증에 말린 나는 break가 아닌 continue를 써서 삽질을 하고있었다. 

 

break와 continue차이는 아래에서 코드에서 바꿔서 생각해본다면 break는 for문을 벗어나 while문 공간으로 가지만 continue는 for문안에서 continue아래 코드들만 무시하고 다시 for로 돌아가게 된다. 한마디로 for문 유효범위 내 맨 아래로 이동하는것이다.

 

function solution(msg) {
  let dic = new Object();
  for (let i = 65; i <= 90; i++) {
    dic[[String.fromCharCode(i)]] = i - 64;
  }

  let nowString = msg;
  let result = [];
  let count = 27;
  while (true) {
    let add = "";
    for (let i = 0; i < nowString.length; i++) {
      add += nowString[i];
      if (Object.keys(dic).includes(add) === false) {
        dic[[add]] = count;
        count++;
        add = add.slice(0, i);
        result.push(dic[add]);
        let temp = nowString.split("");
        temp.splice(0, i);
        temp = temp.join("");
        nowString = temp;
        break;
      }
      if (i === nowString.length - 1) {
        result.push(dic[add]);
        nowString = "";
        break;
      }
    }

    if (nowString.length === 0) {
      break;
    }
  }
  return result;
}

 

 

댓글