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

한동곤·2021년 5월 18일
0

코딩테스트

목록 보기
1/2

[링크]

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

[풀이]

  • for문을 i = 1부터 s의 길이 / 2만큼 돌린다. (i는 잘릴 문자의 수)
  • for문을 j = 0부터 s의 길이 만큼 돌린다. (j는 [s 기준의] 잘린 문자열의 첫 인덱스)
  • 스택이 비어있는지 확인한다.
    • [비어있다면] countList에 1을 넣고 stack에 잘린 문자열을 넣는다.
    • [비어있지않다면] 스택에서 문자열을 꺼낸 뒤 현재 문자열과 비교한다. (꺼낸 문자열은 다시 넣는다.)
      • [문자열이 같다면] countList 마지막 값을 +1한다.
      • [문자열이 같지않다면] countList에 1을 넣고 현재 문자열을 스택에 넣는다.
    • countList에서 1보다 큰 수들의 길이(1은 생략 가능함으로)와 stack 문자열의 길이를 합하면 i만큼 잘라 압축한 문자열의 길이가 나온다.
  • 각각의 문자열의 길이를 비교하여 제일 작은 값을 return한다.

[코드]

function solution(s) { 
    let answer = s.length;
    for(let i = 1; i <= s.length; i++) {
        const countList = new Array();
        const stack = new Array();

        for(let j = 0; j < s.length; j+=i) {
            if(stack.length > 0) {
                let temp = stack.pop();
                stack.push(temp);
                if(temp == s.slice(j, j+i)) {
                    countList.push(countList.pop()+1);
                    continue;
                }
            }
            stack.push(s.slice(j, j+i));
            countList.push(1);
        }
        answer = Math.min(answer, stack.join("").length
        			+ countList.filter((x)=>x>1).join("").length);
    }
    return answer;
}

0개의 댓글