알고리즘/프로그래머스 문제풀이

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

자바칩 프라푸치노 2021. 9. 14. 20:22

https://programmers.co.kr/learn/courses/30/lessons/60057

 

 

 

 

 

 


🎇 풀이방법

이중 for문을 돌려야한다.

"aabbaccc"

이라고 치자.

먼저 문자를 1개 단위로 자른다고 생각해보자.

a와 그 다음 a를 비교한다 -> 같다.

그러면 앞에 2를 적는다.

a와 b를 비교한다 -> 다르다.

그러면 2다음에 a를 적는다.

b와 b를 비교한다 -> 같다.

2a다음에 2를 적는다.

b와 a를 비교한다 -> 다르다.

2a2b를 적는다.

a와 c를 비교한다 -> 다르다.

2a2ba를 적는다. ....

 

이렇게 만든 문자 1개

 

그다음 문자를 2개 단위로 자른다고 가정한다.

aa와 bb를 비교한다. -> 다르다

aa를 적는다.

bb와 ac를 비교한다 -> 다르다

aabb를 적는다 ...

 

이렇게 자를 수 있는 문자는 문자열 길이의 2분의 1까지 자를 수 있기 때문에

여기서는 4개까지 자른 문자를 만들어서 배열에 넣는다.

그러면 배열에는 4개의 문자가 있을텐데 이중에서 가장 길이가 작은 문자의 길이를 리턴하면 된다.

 


 

 

 

 

 

코드 도움 https://sustainable-dev.tistory.com/153

 

function solution(s) {
	//문자열 길이 1인 경우
    if (s.length === 1) return 1;
    let strings = [];
    let answer = 0;
    //첫번째 반복문은 압축할 문자열 길이 1부터 시작 ~ 문자열 길이 / 2
    //최대로 압축할 수 있는 길이는 문자열/2까지
    for(let i = 1; i <= parseInt(s.length / 2); i++) { //문자를 몇개 단위로 나눌 것인가
        let cnt = 1;
        let string = '';
        for(let j = 0; j < s.length; j += i) {
            const current = s.substr(j, i); //j인덱스 부터 i개를 추출한다. 
            const next = s.substr(j+i, i); //다음 글자
            if(current === next) {
                cnt++;
            } else {
                string = cnt > 1? string + cnt + current : string + current;
                cnt = 1;
            }
        }
        strings.push(string.length);
    }
    return Math.min(...strings);
}

 

 

 

728x90