프로그래머스 60057번 - 문자열 압축

문제 링크 : 프로그래머스 60057번 - 문자열 압축

내 풀이 링크 : Github - HeeJeYang

문제를 해결했지만 좋은 코드라고 생각할 수 없을 것 같아 다른 개발자 분들의 좋은 풀이들을 보고 이해하여 내 것으로 만들어보려고 한다.

다른 개발자 분의 풀이 :

const solution = s => {
  const range = [...Array(s.length)].map((_, i) => i + 1); // 1번
  return Math.min(...range.map(i => compress(s, i).length)); // 4번
};

const compress = (s, n) => {
  const make = ([a, l, c]) => `${a}${c > 1 ? c : ''}${l}`;
  return make(
    chunk(s, n).reduce( // 3번
      ([a, l, c], e) => e === l ? [a, l, c + 1] : [make([a, l, c]), e, 1],
      ['', '', 0]
    )
  );
};

const chunk = (s, n) => // 2번
  s.length <= n ? [s] : [s.slice(0, n), ...chunk(s.slice(n), n)];

예시(s = "abcabcdedede")

1번 : 잘라서 압축할 단위의 개수를 지정해준다.
(예시: range = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
사실 문자열의 길이의 반인 6 이후부터는 비교 대상이 없어 압축되지 않으므로 필요없다.
따라서 const range = [...Array(Math.floor(s.length / 2))].map((_, i) => i + 1);
이렇게 작성하여 range = [1, 2, 3, 4, 5, 6]으로만 해도 코드에 문제가 없고 map에 의한 compress 함수 호출 횟수를 줄일 수 있어 더 좋을 것 같다.

2번 : n에 들어오는 값을 단위로 하여 문자열 s를 잘라 배열에 넣고 반환하다.
(예시:

console.log(chunk("abcabcdedede", 3)) // ["abc", "abc", "ded", "ede"]
console.log(chunk("abcabcdedede", 5)) // ["abcab", "cdede", "de"]

만약 단위만큼 자르고 남는 문자열은 뒤에 위 코드의 두번째 줄처럼 배열 끝에 붙여준다.)

3번 : 이 부분이 간단히 이해되어 넘어갔더라면 게시글을 써서 기록할 생각이 없었을 것이다..
chunk 함수에서 반환된 배열에 대해 압축할 수 있는 부분이 있는지 체크하는 곳이다. 예시를 먼저 보자.
(예시: compress("abcabcdedede", 3)일 때,
1. chunk("abcabcdedede", 3)의 출력값은 ["abc", "abc", "ded", "ede"]
2. reduce 함수 내부에서 초기값은 ["", "", 0], 현재값은 "abc"일 때, e === lfalse이므로 누산기(acc)에 저장된 값은 [make("", "", 0), "abc", 1], make 함수 풀면 ["", "abc", 1]
3. 다음 루프(e = "abc", l === "abc")에서 e === ltrue이므로 누산기(acc)에 저장된 값은 ["", "abc", 2]
4. 다음 루프(e === "ded", l === "abc")에서 e === lfalse이므로 누산기(acc)에 저장된 값은 make 함수까지 계산하여 ["2abc", "ded", 1]
5. 마지막 루프(e === "ede", l === "ded")에서 e === lfalse이므로 반환될 값은 ["2abcded", "ede", 1]
6. 위 반환값을 make 함수에 삽입하여 나온 값 "2abcdedede"를 반환한다.)

4번 : range.map을 통해 3번의 과정을 n값을 바꾸며 실행시킨 뒤 길이가 가장 짧은 값을 문제의 답으로 반환시킨다.

마치며

내가 실제 면접에서 이렇게 잘 정돈된 코드를 구현할 수 있을 정도로 손에 익혀야겠다.

좋은 웹페이지 즐겨찾기