개발 공부/알고리즘 문제 풀이

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

종범2 2020. 6. 4. 22:07

문제

프로그래머스 2020 KAKAO BLIND RECRUITMENT 문자열 압축

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

 

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

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

programmers.co.kr

언어

바스크립트(JavaScript)

 

접근 방법

  1. 1부터 문자열 크기의 절반 개수까지인 i개 단위로 모두 압축해본다.
  2. j는 i부터 시작하는데, j-i부터 i개의 문자와 j부터 i개의 문자가 같으면 압축이 가능하다. 압축이 가능하면 카운터를 1 증가시킨다.
  3. 만약 압축이 안된다면 압축 횟수와 문자를 그대로 붙인다. 만약 압축 횟수가 1이라면 문자만 붙인다.
  4. j는 i 만큼씩 증가시킨다.
  5. i개씩 문자열을 압축시키면 끝에 남는 문자열이 있는데, 이 문자열은 그대로 붙인다.

코드

function solution(s) {
    let arr = [];
    // 문자열 크기의 절반 수까지 i개 단위로 압축
    for(let i=1; i<= parseInt(s.length/2); i++){
        // 0부터 i개의 문자가 첫 번째 압축 문자
        let str = s.substr(0,i);
        let cnt = 1;
        // j-i부터 i개의 문자와 j부터 i개의 문자가 같으면 cnt 1증가
        // 아니면 str에 그 문자를 숫자와 그대로 붙이기 (1이면 문자만 붙임)
        // 이때 j는 i만큼씩 증가
        for (let j=i; j<= s.length-i; j=j+i){
            if (s.substr(j-i,i) === s.substr(j,i)){
                cnt++;
                if(s.length-j-i<i){
                    str+= cnt;
                }
            }else{
                if (cnt !== 1){
                    str+= cnt;
                    str+=s.substr(j,i);
                }else{
                    str+=s.substr(j,i);
                }
                cnt = 1;
            }
        }
        // 남은 문자열은 압축할 수 없으므로 그대로 붙이기
        str+=s.substr(s.length-1-(s.length % i), (s.length % i));
        arr.push(str);
    }
    // 제일 압축 잘한 경우 반환
    let min = 100000;
    for (let i=0; i< arr.length; i++){
        if (arr[i].length < min){
            min = arr[i].length;
        }
    }
    if (s.length === 1)
        min = 1;
    console.log(arr);
    return min;
}

복기

  1. 처음에 주석 안 달고 코드만 쭉 짜다 보니 인덱스가 너무 헷갈렸다. 내 코드에 주석을 잘 달면서 인덱스 의미를 계속 보면서 문제를 풀어야겠다.