알고리즘
2020 카카오 1차 코딩테스트 문제 1
아나니리
2020. 1. 26. 21:38
전체 코드
class Solution {
public int solution(String s) {
int answer = s.length();
if (s.length() == 1) {
return 1;
}
for (int i = 1; i <= s.length() / 2; i++) {
String result = compression(i, s);
if (answer > result.length()) {
answer = result.length();
}
}
return answer;
}
// 압축된 문자열 만들기
private String compression(int size, String s) {
List<String> subStrings = getSubString(size, s);
String result = "";
String temp = subStrings.get(0);
int count = 1;
for (int i = 1; i < subStrings.size(); i++) {
if (temp.equals(subStrings.get(i))) {
count++;
} else {
result += addSubResult(count, temp);
count = 1;
temp = subStrings.get(i);
}
}
result += addSubResult(count, temp);
return result;
}
private String addSubResult(int count, String temp) {
String result = "";
if (count != 1) {
result += count;
}
result += temp;
return result;
}
// size 크기로 문자열 나누기
private List<String> getSubString(int size, String s) {
List<String> subStrings = new ArrayList<>();
for (int i = 0; i < s.length() / size; i++) {
subStrings.add(s.substring(i * size, (i + 1) * size));
}
// 나머지 넣기
if (s.length() % size != 0) {
subStrings.add(s.substring(s.length() - s.length() % size));
}
return subStrings;
}
}
문제에서 압축된 가장 작은 문자열의 길이만 원한다.
문자열을 만들어서 합치는 거보다 합친 문자열의 길이만 구하는 게 속도가 더 빠르다. (문자열 합치는데 비용이 크기 때문에)
private int compressionSize(int size, String s) {
List<String> subStrings = getSubString(size, s);
int result = 0;
String temp = subStrings.get(0);
int count = 1;
for (int i = 1; i < subStrings.size(); i++) {
if (temp.equals(subStrings.get(i))) {
count++;
} else {
result += addSubResultSize(count, temp);
count = 1;
temp = subStrings.get(i);
}
}
result += addSubResultSize(count, temp);
return result;
}
private int addSubResultSize(int count, String temp) {
if (count == 1) {
return temp.length();
}
// (int)(Math.log10(count)+1) >> count 숫자의 자리수
return temp.length() + (int)(Math.log10(count)+1);
}
다른 부분은 같고 압축된 문자열의 길이를 구하도록 했다.
속도가 5배 이상 빨라진 것을 확인할 수 있다.