Algorithm/Programmers

[Programmers - 자바] 문자열 압축

tjddneva 2022. 3. 13. 14:47

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

 

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

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

programmers.co.kr

 

그동안 문제는 많이 풀었는데 오랜만에 포스팅한다.

 

정말 문자열 처리하는 문제 꽤 많이 풀었다고 생각했는데 역시 할 때마다 너무 어렵고 힘들다. 호다다닥 풀어야 하는데 너무 오래걸린다. 매번 적응이 안돼 하...

 

풀이를 해보자.

 

큰 틀을 보면

int answer = 1001; 

String ans = "";

으로 선언하고 문자열을 압축한 것을 ans 에 넣고 그 길이를 매번 업데이트 해서 answer 넣을 것이다. 

 

다음은

for(int i=1; i<=s.length(); i++){

    ....

}

문자를 1개씩 자를 때, 2개씩 자를 때 .... 로 for 문을 만들었다. 가장 큰 for문이다. 여기 안에 이거저거 다 넣을거다.

 

이제 안의 핵심을 보면

 

        String temp,temp2;
        for(int i=1; i<=s.length(); i++){
            StringBuilder sb = new StringBuilder(ans);
            temp = s.substring(0,i);
    
            int count = 1;
            int j;
            for(j=i; j+i<=s.length(); j=j+i){
                temp2 = s.substring(j,j+i);
                if(temp.equals(temp2)){
                    count++;
                }
                else{
                    if(count!=1) sb.append(count);
                    sb.append(temp);
                    temp = temp2;
                    count = 1;
                }
            }
            if(count!=1) sb.append(count);
            sb.append(temp);
            
            if(j+i>s.length()){
                sb.append(s.substring(j));
            }
            
            if(sb.length() < answer) answer = sb.length();
        }

이렇게 생겼다.

1. 우선 temp 에 0번째 index 부터 i 번째 index 까지 가져온다! 1개씩 자르면 1단어 일거고 2개씩 자르면 2단어 일거고 이런식으로.

 

2. 반복되는 개수를 위한 count 그리고 인덱스를 알아야해서 j를 for문 바깥에 선언하였다.

 

3. 그 후 String s 의 를 i개씩 잘라가며 확인한다. 그걸 temp 랑 비교해서 몇개있는지 확인한다.

 

4. 만약 다른게 나오면 여태까지 개수와 반복된 문자열을 append 한다! 단 count 가 1 일 경우는 count 는 뺀다.

 

5. for문을 빠져나오면 추가로 해줄게 있다. 마지막에 같은게 연속해서 나온거는 for 문 안에 else 에 안들어가서 추가가 안되어 있으므로 추가로 append 한다. 

 

6. 하나 더 해줄 게 있다. 마지막에 i개씩 잘라야하는데 길이가 넘어가서 못자른 나머지 문자들을 다 append 해준다.

 

7. 이제 길이를 비교해서 answer 를 업데이트 해준다! 

 

남의 코딩 읽는게 제일 힘들다. 남들은 어떻게 설명을 그렇게 잘하는지 모르겠다.

하여간 아래는 전체 코드이다.

 

import java.io.*;
import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 1001;
        String ans = "";
                
        String temp,temp2;
        for(int i=1; i<=s.length(); i++){
            StringBuilder sb = new StringBuilder(ans);
            temp = s.substring(0,i);
    
            int count = 1;
            int j;
            for(j=i; j+i<=s.length(); j=j+i){
                temp2 = s.substring(j,j+i);
                if(temp.equals(temp2)){
                    count++;
                }
                else{
                    if(count!=1) sb.append(count);
                    sb.append(temp);
                    temp = temp2;
                    count = 1;
                }
            }
            if(count!=1) sb.append(count);
            sb.append(temp);
            
            if(j+i>s.length()){
                sb.append(s.substring(j));
            }
            
            if(sb.length() < answer) answer = sb.length();
        }
        
        return answer;
    }
}