프로그래머스

[Programmers] 60057. 문자열 압축 (java)

jooona 2021. 9. 10. 12:11
반응형

해당 문제는 2중 for문을 이용해 해결할 수 있습니다.

 

우선 문자열 s의 길이가 1이거나 2이면, 어떤 방법을 사용하더라도 문자열의 길이를 압축할 수 없기 때문에 그냥 문자열의 길이를 그대로 리턴해줍니다.

 

그 외의 경우에 대해 두 개의 반복문을 이용해 문제를 해결합니다.

 

외부 반복문: 압축을 진행할 단위 수를 조절해줍니다. 처음에는 1글자로 시작해서 문자열 s의 길이까지 확인해 줍니다.

내부 반복문: 문자열 내부에서 특정 문자열이 압축이 가능한 지를 확인합니다.

 

문자열에서 substring 함수는 문자열을 잘라주는 역할을 합니다. 즉 문자열 s에 대해 s.substring(0,3)과 같이 사용하면 index 0부터 2까지의 문자열을 잘라서 저장해줍니다.

 

예를 들면,

String s = "hello";

String s_ = s.substring(1,3);

과 같이 코드를 실행하면 s_에는 "el"이 들어가게 됩니다.

 

이 문제에서 예외 경우를 생각해주어야 할 부분이 있는데 바로 압축되는 문자열의 수가 10을 넘어가는 경우입니다.

즉 압축할 문자열의 압축된 개수가 9개이냐 10개이냐에서 차이가 발생하는 것인데, 

sssssssss를 한 글자 단위로 압축하면 9s가 되지만

ssssssssss를 한 글자 단위로 압축하면 10s가 되어 압축된 문자열이 한 글자 늘어나게 되는 것입니다.

 

이처럼 숫자의 자릿수가 늘어나는 경우만 예외처리를 잘 해주면 쉽게 문제를 해결할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.*;
import java.util.*
 
class Solution {
    public int solution(String s) {
        int answer = 100000;
        if(s.length() == 1 || s.length()==2)
            return s.length();
        
        int i, j;
        for(i=1;i< s.length();i++){
            String now = " "
            int answer_now = 0
            int flag = 0
            for(j=0; j+i-1<s.length();j+=i){ 
                if(now.equals(s.substring(j,j+i))){
                    if(flag == 0){
                        answer_now+=1;
                        flag ++;
                    }
                    flag++;
                    if(flag == 10 || flag == 100 || flag == 1000){
                        answer_now++;
                    }
                } else{
                    now = s.substring(j,j+i);
                    answer_now += i;
                    flag = 0;
                }
            }
            answer_now += s.length() - j;
            answer = Math.min(answer, answer_now);
        }
        return answer;
    }
}
cs
반응형