프로그래머스 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 === l
이 false
이므로 누산기(acc)에 저장된 값은 [make("", "", 0), "abc", 1]
, make 함수 풀면 ["", "abc", 1]
3. 다음 루프(e = "abc"
, l === "abc"
)에서 e === l
이 true
이므로 누산기(acc)에 저장된 값은 ["", "abc", 2]
4. 다음 루프(e === "ded"
, l === "abc"
)에서 e === l
이 false
이므로 누산기(acc)에 저장된 값은 make 함수까지 계산하여 ["2abc", "ded", 1]
5. 마지막 루프(e === "ede"
, l === "ded"
)에서 e === l
이 false
이므로 반환될 값은 ["2abcded", "ede", 1]
6. 위 반환값을 make 함수에 삽입하여 나온 값 "2abcdedede"
를 반환한다.)
4번 : range.map
을 통해 3번의 과정을 n
값을 바꾸며 실행시킨 뒤 길이가 가장 짧은 값을 문제의 답으로 반환시킨다.
마치며
내가 실제 면접에서 이렇게 잘 정돈된 코드를 구현할 수 있을 정도로 손에 익혀야겠다.
Author And Source
이 문제에 관하여(프로그래머스 60057번 - 문자열 압축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@heejeyang/프로그래머스-60057번-문자열-압축저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)