ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeKata] 프로그래머스 : 4.7(수), 압축
    Algorithm 2021. 4. 8. 19:46
    반응형

    🥋 Ooooth!! (Level 2)

    우선 문자열을 잘라가는데, 이는 사전에 해당 문자열이 포함되어있어야 한다는 기준을 고려해야 한다.

    KAKAO를 자르기 시작하면, KA는 사전에 포함되어있지 않으므로 그 전까지인 K의 인덱스를 정답배열에, KA는 사전의 새로운 요소로 추가해주면 된다.

    위 일련의 처리가 끝나면, 그 다음부터인 A에서 시작하여, AK, AKA... 순으로 검색하면 된다.

    (여기서도 AK가 사전에 없으므로 멈추게 되겠지)

     

     

     🧮 풀이

    function solution(msg) {
      let answer = [];
      let dic = Array.from({ length: 27 }, (_,i) => String.fromCharCode(i+64))
      let s = 0;
      let e = 1;
    
      while (true) {
        const key = msg.substring(s,e)
        if (e === msg.length + 1) {
          answer.push(dic.indexOf(key))
          break;
        }
        else if (!dic.includes(key)) {
          answer.push(dic.indexOf(key.slice(0, -1)))
          dic.push(key)
          s = e-1;
        }
        else {
          e++;
        }
      }
    
      return answer;
    }
    • answer는 우리가 반환할 정답이자, 인덱스들이 담겨있는 배열이다.
    • dic알파벳을 사전으로 저장한 배열이다. 각 요소는 인덱스와 fromCharCode 아스키코드 함수로 알파벳을 저장했다.
    • s, emsg 문자열을 자르기 위한 시작과 끝 인덱스이다.
    • 다음으로, while 반복문을 반복한다. 조건은 true로, 내부에서 break 조건을 걸었다. key는 s,e로 자른 msg의 문자열이다.
    • 마지막 else는 answer 추가나 반복종료의 조건이 아닌 경우이다. 이 때는, e++ 증가시키며 문자열(key)을 연장한다.
    • else if는 answer 추가조건이다. 현재 key가 dic에 없으므로, 끝값을 자른 문자(slice(0,-1)의 dic 인덱스를 answer에 추가한다.
    • 또한, dic에 새롭게 key 요소를 추가해준다. 다시, 바로 전 인덱스부터 잘라야 하므로 시작 인덱스(s)를 e-1로 업데이트한다.
    • e가 msg.length+1 과 같아지면 msg 문자열 끝에 도달한 경우다. 이 때는, 마지막 key를 처리하고 break 로 종료시켜준다.

     

    🖇 리뷰

    처음에는 각 문자를 배열로 변환해서 풀어보았지만, 아무래도 push, shift, join 동작들이 반복되며 효율성에 문제가 있었다.

     

    또, 알고리즘 외 TMI를 읊자면... 요즘 주니어 프론트로 첫 취업을 위한 면접을 보면서 포스팅이나 알고리즘을 많이 못 하고 있다.

    남은 Level2를 간간히 마무리시키고, 당분간 취업에 매진할 생각이다!

     

    이후부터는 Level3를 풀면서 더 심화된 알고리즘과 개념들을 학습하면서 문제들을 클리어해나갈 계획이다!!!  

    반응형
Designed by Tistory.