반응형
해당 문제는 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 |
반응형
'프로그래머스' 카테고리의 다른 글
[Programmers] 67259. 경주로 건설 (java) (1) | 2021.09.10 |
---|---|
[Programmers] 12973. 짝지어 제거하기 (java) (0) | 2021.09.10 |