Study with book/Algorithms

[2020 카카오 블라인드 온라인 코딩 테스트] 문자열 압축


 

 

[문자열 압축] programmers.co.kr/learn/courses/30/lessons/60057

 

 

풀고 느낀점

간단하면서도 간단하지 않은 느낌이었습니다. 생각보다 푸는데 시간이 많이 들었습니다. 한 1시간정도 소요된 것 같습니다. 문제를 제대로 읽지 않아서 처음에 엉뚱한 방법으로 풀다가 문제를 잘못 읽은 것을 알고 다시 풀었습니다. 문제를 진짜 꼼꼼하게 읽어야할 것 같습니다. String 클래스의 startWith() 메소드를 활용해서 크기별로 계속 자르면서 List에 담았고 나중에 for문을 돌면서 가장 작은 String Length를 반환하도록 하였습니다. 첫 문제라서 쉽다고 생각하고 빨리 풀어야지 하다가 결국 더 오래 걸린 느낌입니다. 문제를 꼼꼼히 읽는 습관을 길어야 할 것 같습니다.

 

package algorithms.online.kakao.year2020;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* 문자열 압축
* https://programmers.co.kr/learn/courses/30/lessons/60057
*/
public class Problem1 {
public static void main(String[] args) {
Problem1 problem1 = new Problem1();
System.out.println(problem1.solution("aabbaccc"));
System.out.println(problem1.solution("ababcdcdababcdcd"));
System.out.println(problem1.solution("abcabcdede"));
System.out.println(problem1.solution("abcabcabcabcdededededede"));
System.out.println(problem1.solution("xababcdcdababcdcd"));
}
public int solution(String s) {
int len = s.length() / 2;
List<String> store = new ArrayList<>();
for (int size = 1; size <= len; size++) {
String target = s.substring(0, size);
String sub = s.substring(size);
StringBuilder candidate = new StringBuilder();
int count = 1;
while (sub.length() != 0) {
while (sub.startsWith(target)) {
count++;
sub = sub.substring(size);
}
if (count != 1) {
candidate.append(count);
candidate.append(target);
} else {
candidate.append(target);
}
if (sub.length() == 0) {
break;
}
if (target.length() > sub.length()) {
candidate.append(sub);
break;
}
target = sub.substring(0, size);
count = 0;
}
store.add(candidate.toString());
}
return store.stream().min(Comparator.comparingInt(String::length)).map(String::length).orElse(s.length());
}
}