
이해한대로 코드로 작성할 수 있는 능력을 길러야 합니다.
(이해도 안되고, 작성도 어렵다..)
압축할 문자열 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;
}