이해한대로 코드로 작성할 수 있는 능력을 길러야 합니다.
(이해도 안되고, 작성도 어렵다..)
압축할 문자열 s
가 주어질 때, 1개 이상의 단위로 문자열을 잘라 압축하여 표현한 문자열 중
가장 짧은 것의 길이를 반환합니다.
압축하는 방법은 같은 값이 연속되는 문자에 대해 그 개수와 반복되는 값으로 표현하여 압축합니다.
aabbaccc
를 1개 단위로 압축하면 다음과 같습니다. 2a2ba3c
ababcdcdababcdcd
는 1개 단위는 압축되지 않지만, 다른 단위로 압축하면 압축됩니다.
ababcdcdababcdcd
를 8개 단위로 압축하면 길이가 9로 가장 짧아집니다.
압축된 문자열의 길이를 담고, 최소 값을 반환합니다.
1부터 문자열의 길이까지 압축할 단위로 설정하여, 압축 함수 compression
을 호출합니다.
function solution(s) {
const result = [];
for (let i=1; i<=s.length; i++) {
result.push(compression(s,i).length);
}
return Math.min(...result);
}
비교의 기준이 될 prev
를 만들어 비교합니다.
만약 단위대로 자른 문자열이 prev
와 같다면, count
를 증가합니다.
count
가 1 이상이면, count
와 중복된 문자를 result
에 추가합니다.
다르다면, prev
를 변경합니다.
단위대로 자른 문자열 외에, 남는 문자열은 뒤에 붙혀줍니다.
function compression(s,step) {
let result = '';
let prev = s.slice(0,step);
let count = 1;
for (let i=step; i<=s.length-step; i+=step) {
const now = s.slice(i,i+step);
if(now == prev) {
count++;
}
else {
result += count>1?`${String(count)}${prev}`:prev;
prev = now;
count = 1;
}
}
result += count>1?`${String(count)}${prev}`:prev;
const restLength = s.length % step;
if (restLength != 0) result += s.slice(-restLength);
return result;
}