Algorithm/Programmers
[Programmers] 2020카카오공채 문자열 압축
goakgoak
2020. 8. 24. 19:50
[Level 2] 문자열 압축
https://programmers.co.kr/learn/courses/30/lessons/60057
- 레벨 2 문제인데 문제를 제대로 이해하지 못해서 너무 오래 풀었다.. ㅠㅠ
- 압축할 문자열 s가 매개변수로 주어질 째, 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성하시오.
- 헷갈렸던 포인트는 문자열을 앞에서 부터 n개씩 잘라야한다는 부분이 n=2, aa/ab/aa/dd/ee/... 같이 연속해서 n개로 압축하는 것이 아니라 aa/abcabcd/rr/dd/... 처럼 첫 부분만 2개로 잘리면 뒷부분에서는 자유롭게 2개씩 묶어 압축하는 방식으로 이해했다. 노답스;;
Solution
- 완전 탐색으로 1~s.length()/2 조각에 대해 전부 압축한 다음, 최소값을 return 하는 방식으로 풀이했다.
- s.length() % cut의 값인 exsit는 cut 보다 작은 조각 이므로 더이상 압축할 수 없어 마지막에 len 값으로 더해준다.
소스코드
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
|
import java.util.*;
class Solution {
public static int solution(String s) {
int answer = s.length();
int cut = 0;
while (cut++ < s.length() / 2) {
int count = 1;
String prev = s.substring(0, cut);
String cur = null;
int len = 0;
String exist = s.substring(s.length() - s.length() % cut);
for (int i = cut; i <= s.length() - (exist.length() + cut); i += cut) {
cur = s.substring(i, i + cut);
if (prev.equals(cur)) {
count++;
} else {
if (count > 1) {
len += prev.length() + Integer.toString(count).length();
} else {
len += prev.length();
}
count = 1;
prev = cur;
}
}
if(count > 1) len += prev.length() + Integer.toString(count).length();
else len += prev.length();
answer = Math.min(answer, len + exist.length());
}
return answer;
}
}
|
cs |