하루에 한 문제

[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 문자열 압축 -JavaScript 본문

알고리즘/프로그래머스

[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 문자열 압축 -JavaScript

dkwjdi 2021. 5. 3. 20:54

https://programmers.co.kr/learn/courses/30/lessons/60057?language=javascript#

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

function solution(s) {
    var answer = s.length;
    let len=s.length;
    
    for(let i =1; i<=len/2; i++){ //자르는 크기
        let j=i;
        let cnt=1;
        let compressionStr =""
        let str = s.substring(0, i);
       
        for(; j<=len; j+=i){
            if(str===s.substring(j,j+i)) cnt++;
            else {
                if(cnt===1) compressionStr+=str;
                else compressionStr+=cnt+str;
                str=s.substring(j,j+i);
                cnt=1;
            }
        }
        
        if(cnt===1) compressionStr+=str;
        else compressionStr+=cnt+str;
        answer=Math.min(answer, compressionStr.length)
    }
    return answer;
}

소요시간 : 20분

 

우선 가장 바깥은 포문은 s의 길이/2 만큼만 돌아주면 됩니다.

s의 길이/2 보다 커지면 절대로 압축을 할 수 없기 때문입니다.

 

로직을 살펴보면

 

1. 현재 문자열과 다음 문자열(현재 문자열 기준 + 사이즈만큼 자른 문자열)이 같으면 cnt++을 해줍니다.

2. 현재 문자열과 다음문자열이 다르다면 

   - cnt가 1일 때 : 숫자를 붙여줄 필요가 없기 때문에 바로 문자를 더해줍니다.

   - cnt가 1이상일 때 : 압축이 되었다는 뜻이기 때문에 숫자 + 문자를 해줍니다.

 

아 그리고 주의사항으로는 "a" 같이 한 글자만 들어왔을 때 예외 처리를 해주어야 합니다.

저는 맨처음 answer에 s의 길이를 주는 것으로 예외사항을 처리했습니다.

 

끝~ 

 

Comments