문자열 압축
문제정의
문자열을 일정 단위로 끊어서 압축하려고 한다(ex. abab -> 2ab). 몇 개 단위로 끊어서 압축이 가장 많이 된 문자열의 길이를 계산하는 문제이다.
문제풀이
전체 코드는 다음과 같다. 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59public class StringCompress {
//프로그래머스 문제풀이 level2 문자열 압축
public static void main(String[] args)
{
String s = "aabbcc";
StringBuffer buff = new StringBuffer();
int answer = 2000;
int cnt = 1;
if(s.length() == 1)
answer = 1;
for(int cut = 1; cut <= s.length()/2; cut++)
{
String key = s.substring(0, cut);
buff.delete(0, buff.length());
cnt = 1;
for(int i = cut; i < s.length(); i += cut)
{
if(i + cut > s.length())
{
if(cnt > 1)
buff.append(cnt);
buff.append(key);
buff.append(s.substring(i, s.length()));
break;
}
else if(key.equals(s.substring(i, i+cut)))
{
cnt++;
if(i == s.length()-1 || i+cut == s.length())
{
buff.append(String.valueOf(cnt));
buff.append(key);
}
}
else
{
if(cnt > 1)
buff.append(String.valueOf(cnt));
buff.append(key);
if(i + cut >= s.length())
{
buff.append(s.substring(i, s.length()));
break;
}
key = s.substring(i, i+cut);
cnt = 1;
}
}
String str = buff.toString();
answer = Math.min(answer, str.length());
}
System.out.println(answer);
}
}
시간복잡도는 문자열의 길이를 n이라 할 때, 최대 \(n^2/2\) 만큼 반복하므로 \(O(n^2)\)이다.