[프로그래머스] 문자열 압축

쿼카쿼카·2023년 7월 15일
0

알고리즘

목록 보기
65/67

문제

코드

// 내가 푼 풀이
function solution(s) {
    let ans = s.length, leng = ans;
    for(let i=1; i<=s.length/2; i++) {
        let target = '', count = 0;
        for(let j=0; j<i*Math.floor(s.length/i); j+=i) {
            const cur = s.slice(j, j+i);
            if(count === 0) {
                target = cur
                count++;
            }
            else {
                if(target === cur) count++;
                else {
                    if(count !== 1) {
                        if(count < 10) leng -= i*count-(i+1);
                        else if(count < 100) leng -= i*count-(i+2);
                        else if(count < 1000) leng -= i*count-(i+3);
                        else leng -= i*count-(i+4);
                    }
                    count = 1;
                    target = cur;
                }
                if(j+i === s.length - (s.length%i) && count !== 1) {
                    if(count < 10) leng -= i*count-(i+1);
                    else if(count < 100) leng -= i*count-(i+2);
                    else if(count < 1000) leng -= i*count-(i+3);
                    else leng -= i*count-(i+4);
                }
            }
        }
        if(ans > leng) ans = leng;
        leng = s.length;
    }
    return ans;
}

function solution(s) {
    if(s.length === 1 ) return 1;
    let min = 1000;
    for (let i = 1; i <= s.length / 2; i++) {
        let str1 = '';
        let str2 = '';
        let ans = '';
        let count = 1;
        for (let j = 0; j < s.length; j += i) {

            if( j === 0 ) {
                str1 = s.slice(j, j + i);
            }else{
                str2 = s.slice(j, j + i)
                if(str1 === str2){
                    count++;
                    if(j+i === s.length) ans += `${count}${str1}`;

                }else{
                    if( count > 1 ){
                        ans += `${count}${str1}`
                    }else{
                        ans += str1;
                    }
                    count = 1;
                    if(str1.length > str2.length){
                        ans += str2;
                    }
                    str1 = str2;
                    if(j+i === s.length) ans += str2;
                }
            }
        }
        min = Math.min(ans.length, min);
    }
    return min;
}

같은 문자의 반복 자릿수가 달라진다.

  • s의 절반길이까지만 체크
  • 난 자릿수 체크를 하지 않고 항상 1의 자리로 계산했다.
  • 실패하는 테스크 케이스가 10의 자리 100의 자리까지 반복된다는 것을 알고, if 문을 넣어줬다.
  • 넣으면서도 이거 좀 아닌 것 같은데 싶었다.

count와 str을 이용한 풀이

  • count를 계산 후 현재 문자열인 str 앞에 count를 바로 붙여줬다.
  • 문자열로 된 숫자 + 문자열 조합으로 if문 없이 간단히 풀었다.
profile
쿼카에요

0개의 댓글