[코테] 문제풀기 #3

Yuno·2021년 6월 29일
1
post-thumbnail

이해한대로 코드로 작성할 수 있는 능력을 길러야 합니다.

(이해도 안되고, 작성도 어렵다..)

문자열 압축

압축할 문자열 s가 주어질 때, 1개 이상의 단위로 문자열을 잘라 압축하여 표현한 문자열 중
가장 짧은 것의 길이를 반환합니다.

압축하는 방법은 같은 값이 연속되는 문자에 대해 그 개수와 반복되는 값으로 표현하여 압축합니다.

aabbaccc를 1개 단위로 압축하면 다음과 같습니다. 2a2ba3c

ababcdcdababcdcd는 1개 단위는 압축되지 않지만, 다른 단위로 압축하면 압축됩니다.

  • 2개 : 2ab2cd2ab2cd
  • 8개 : 2ababcdcd

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;
}
profile
web frontend developer

0개의 댓글