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

정승옥(seungok)·2020년 12월 29일
0

프로그래머스

목록 보기
29/40
post-thumbnail

문제설명

  • 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 표현하는 알고리즘 구현
  • 문자열을 1개 이상의 단위로 잘라서 압축하여 더 짧은 문자열로 표현하는 방법 찾기
    1) ababcdcdababcdcd -> 1개 단위 ababcdcdababcdcd
    2) ababcdcdababcdcd -> 2개 단위 2ab2cd2ab2cd
    3) ababcdcdababcdcd -> 8개 단위 2ababcdcd(가장 짧은 문자열)
  • 압축할 문자열 s를 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 반환

제한사항

  • s의 길이는 1이상 1,000이하
  • s는 알파벳 소문자로만 구성

풀이

function solution(s) {
    const result = []; // 1 ~ 문자열 길이/2까지 단위로 나눈 문자열을 담는 배열
    const reduceResult = []; // 압축한 문자열을 담을 배열
    let index; // 문자열 인덱스를 담을 변수
    let reduceString=''; // 압축한 문자열을 담을 변수
  
    // 문자열 길의 절반까지만 반복문
    // 1 ~ 문자열 길이의/2까지 나눈 문자열들을 result배열에 담음
    // 각 단위가 끝날때마다 마지막에 '/' 추가하여 구분
    for(let i=1;i<=s.length/2;i++){
        index = 0;
        while(true){
            const word = s.substr(index,i);
            result.push(word);
            index += i;
            if(index > s.length-1){
                result.push('/');
                break;
            }
        }
    }
    
    // 반복되는 문자열의 갯수를 담는 변수 check
    // 압축 문자열을 담을 변수 reduceString
    // 반복인 경우 check만 횟수 증가
    // 반복이 아닌 경우 check가 1이 아니면 이전에 반복된게 있고 
    // check와 함께 reduceString에 추가하고 check는 다시 1로 저장
    // check가 1이면 이전에 반복된게 없고 문자열만 reduceString에 추가
    let check = 1;
    for(let i=0;i<result.length;i++){
        if(result[i] === result[i+1])
            ++check;
        // '/'는 각 단위의 끝
        // 압축 문자열을 압축 배열에 저장하고 압축문자열 초기화
        else if(result[i] === '/'){
            reduceResult.push(reduceString);
            reduceString = '';
        }
        else{
            if(check !== 1){
                reduceString += `${check}${result[i]}`;
                check = 1;
            }else{
                reduceString += result[i];
            }
        }
    }
    
    // 저장된 압축 문자열들중 가장 짧은 길이를 minLength에 저장
    // s의 길이가 1이면 바로 1 반환 아니면 minLength 반환
    let minLength = 1000;
    reduceResult.map(result=>{
        if(result.length<minLength)
            minLength = result.length;
    });
    if(s.length===1)
        return 1;
    else
        return minLength;
}

체크포인트

  • 문자열이 반복되는 경우를 찾아야하므로 문자열 길의 절반 단위까지만 확인
  • 문자열 s의 길이가 1인 경우 압축 문자열은 빈배열로 나오므로 마지막에 따로 1 반환하기
profile
Front-End Developer 😁

0개의 댓글