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 합니다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] 단체사진 찍기 - java (0) | 2021.09.23 |
---|---|
[프로그래머스] 카카오프렌즈 컬러링 북 - java (0) | 2021.09.22 |
[카카오 블라인드 2018] [1차] 캐시 - java (0) | 2021.09.16 |
달팽이 문제 (0) | 2021.09.15 |
[프로그래머스] 예상 대진표 - java (1) | 2021.09.06 |