문자열 압축

Happhee·2022년 2월 3일
0

[ Lv2 ] programmers

목록 보기
10/32
post-thumbnail

📝 문자열 압축

🖥 나의 JS 코드

첫번째 시도

function solution(s) {
  // 우선, s의 길이를 결과 길이 배열에 넣어준다
    let result_lengths = [];
    result_lengths.push(s.length);
    
  // 반복문은 s의 길이 / 2 만큼까지만 반복할 수 있다
    for(let i = 1 ; i <= Math.floor(s.length/2) ; i++){
      // 새롭게 만들어진 str, 해당 단어의 반복횟수  
      let str = '', repeat = 1;
      // s의 길이를 보존시켜야 하므로 이를 제어할 변수 s_copy
      // j는 중복되는 단어를 만들 인덱스
      // 중복단어 check, 남은 문자열을 나타내는 remain
        let s_copy = s, j = i, check, remain;
      
      // 반복문은 i부터 i만큼 증가시키면서, s의 길이보다 커지면 종료
        for( j= i ; j <= s.length ; j+= i){
          
          // j -i 부터 j-1까지의 인덱스 단어를 만듦
             check =s_copy.slice(j-i,j);
          // j부터가 나머지 s
             remain = s_copy.slice(j, s.length);
            

          // remain이 check로 시작하면 반복되는 단어
            if(remain.indexOf(check) === 0){
                repeat++;
            } 
          // 그게 아니라면 반복안되는 단어
          else {
            // 반복횟수가 1이 아니면 숫자를 먼저 담아주고
                if(repeat !=1){
                    str += repeat;
                }
            // 이후 자른 단어를 이어주고
            // 반복횟수를 다시 1로 초기화
                str += check;  
                repeat = 1;
            }
        }
      
      // 만약아직 뒤에 나머지 문자열이 존재하면
      // 이를 연이어 주어야 함
        if(remain.length != 0 ){
            str += remain;
        }
      // 최종적으로 만들어진 str의 길이를 넣어줌
        result_lengths.push(str.length);
    }
  // 최소값 반환
    return Math.min(...result_lengths);
}

두번째 시도

function compressionString(count, str) {
    let same_count = 1, compression_str = "";
    let check_word = "";
    // 처음 비교 문자열 만들어 주기 
    for (let i = 0; i < count; i++)
        check_word += str[i];

    // count 지점 부터 반복문 시작
    for (let i = count; i < str.length; i += count) {
        // 처음과 비교할 문자열 가져오기
        const slice_str = str.slice(i, i + count);
        // 앞뒤 단어가 같으면 count값 증가
        if (check_word === slice_str) {
            same_count++;
        } else {
            // 다를때, 1일 경우에는 숫자는 이어붙이지 않음
            if (same_count === 1)
                compression_str += check_word
            else
                compression_str += (same_count + check_word);

            // 초기화 시켜주고, 비교할 문자열 바꿔주기
            same_count = 1;
            check_word = slice_str;
        }
    }
    // 마지막 단어 이어 붙이는 작업
    if (same_count === 1)
        compression_str += check_word
    else
        compression_str += (same_count + check_word);
    // 길이만 반환
    return compression_str.length
}

function solution(s) {
    let min_length = s.length;
    // 문자열의 길이 반만 수행하면 된다
    for (let i = 1; i <= Math.floor(s.length / 2); i++) {
        // 가장 작은 문자열의 길이를 저장해나감
        const result = compressionString(i, s);
        if (min_length > result) {
            min_length = result;
        }
    }
    // 결과값 반환
    return min_length;
}
profile
즐기면서 정확하게 나아가는 웹프론트엔드 개발자 https://happhee-dev.tistory.com/ 로 이전하였습니다

0개의 댓글