알고리즘
[프로그래머스] 문자열 압축 - java
minkang
2021. 9. 22. 20:21
https://programmers.co.kr/learn/courses/30/lessons/60057
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
import java.util.*;
class Solution {
public int solution(String s) {
int result = Integer.MAX_VALUE;
for(int i=1; i<=(s.length()/2)+1; i++){
result = Math.min(encoding(i, s), result);
}
return result;
}
int encoding(int n, String s){
StringBuilder sb = new StringBuilder();
for(int i=0; i< s.length(); i+=n){
if(i+n > s.length()){
sb.append(s.substring(i));
break;
}
String temp = s.substring(i, i+n);
int cnt = 1;
for(int j=i+n; j+n<= s.length(); j+=n){
if(temp.equals(s.substring(j,j+n))){
cnt++;
i=j;
continue;
}
break;
}
if(cnt > 1){
sb.append(cnt).append(temp);
}
else{
sb.append(temp);
}
}
return sb.length();
}
}
encoding(int n, String s)
n은 몇 개 단위로 압축할지를 나타냅니다.
aabbaccc의 경우
2a2ba3c
aa bb ac cc
aab bac cc
aabb accc
위와 같이
문자열의 길이(8) / 2의 단위 만큼 압축할 수 있습니다.
따라서 encoding 반복횟수를 위와 같이 정해주었습니다.
+1을 한 이유는 문자열 길이가 1개일때의 예외처리를 한 것인데 +1을 하지않고 따로 조건을 빼서 리턴하는게 효율적으로 보입니다.
encoding에서는
1. 첫번째 문자단위부터 시작하여 다음 문자단위와 비교합니다.
2. 같으면 i의 위치를 j로 옮겨주고 그 다음 문자단위와 비교합니다.
3. 비교하는 문자열이 다른 경우 루프문을 빠져나옵니다.
4. 같은 문자열의 갯수에 따라 StringBuilder에 append 합니다.