본문 바로가기

Algorithm/문제풀이

Programmers - 문자열 압축 / Javascript

function solution(s) {
	//문자열 길이 1인 경우
    if (s.length === 1) return 1;
    let strings = [];
    let answer = 0;
    //첫번째 반복문은 압축할 문자열 길이 1부터 시작 ~ 문자열 길이 / 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);
            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);
}

 

 

남는 문자열 처리하는걸 고심하다가 푸는데 오래걸렸다. 겨우 다풀었나 했는데 테스트케이스 5번에서 틀렸다고 나와서 한참 보니까 문자열 길이 1인 경우를 생각안하고 돌림ㅠㅠㅠㅠㅠ 이래서 제한사항도 유심히 읽어보고 코드에 반영해야하는데 항상 놓치는 부분인듯 

 

첫번째 반복문에서 parseInt(s.length / 2)까지만 돌리는 이유는 최대로 압축할 수 있는 길이가 문자열 길이의 절반 크기만큼이기 때문이다.

 

하나에 꽂히면 포기못하고 계속해서 돌려보느라 시간낭비를 많이한 것 같다. 이럴땐 아예 그냥 생각을 리셋시켜버리고 다시 생각하거나 짜는게 도움되는듯 substr함수는 사용하면서 인자가 어떻게 들어가느냐에 따라 return값이 달라지는데, 이부분에 대해 놓치고 있어 계속해서 지저분하게 조건문을 붙이느라 고생했다.

 

substr 함수에서 start인자는 유효(양수이면서 문자열 길이보다 작거나 같을 때)하면서 && length 인자가 생략되거나 start ~ length만큼의 길이가 문자열의 전체 길이보다 크다면 start부터 시작해서 문자열의 끝까지 추출해서 반환하고, 만약 start 인자가 문자열의 전체길이보다 크거나 || length 인자가 0이나 음수일때 빈 문자열을 반환한다.

 

따라서 'aaabbba'를 3글자 기준으로 압축한다면 i = 3이고 j 값이 0 > 3 > 6으로 변화한다. j값이 6이 되면 current = s.substr(6, 3) next = s.substr(9, 3) 이고 current = 'a', next = '' 가 되므로 글자가 남는 경우를 따로 처리해주지 않아도 알아서 string에 current값이 붙는다.