[프로그래머스] 문자열 압축
Updated:
문제 URL
https://programmers.co.kr/learn/courses/30/lessons/60057
풀이
해당 문제는 제한사항이 s의길이가 1이상 1000이하이므로 복잡도가 O(n제곱)인 브루트포스로 풀었다.
for문을 이용한 풀이는 1) 1부터 s.length/2까지 1씩 증가하면서 문자를 자르는 단위를 정해야한다. 2) 자르는 단위를 정했으면 문자열 시작점 0부터 기준점을잡고 각각 문자열 단위마다 문자열 중복이 있는지 검사를시작한다.
나의 풀이
class Solution {
public static int solution(String s) {
int answer = s.length();
//i = 문자를 자르는 단위
for (int i = 1; i <= s.length()/2; i++) {
int len = 0;
StringBuilder sb = new StringBuilder();
// 문자열 시작점 0 부터 단위 i만큼 증가
for(int j=0; j<s.length(); j+=i){
String base;
if(j+i < s.length()){
base = s.substring(j, j+i);
}else{
base = s.substring(j);
}
int dup = 1;
// 중복 검사
for(int k=j+i; k<s.length(); k+=i){
String compare;
if(k+i<s.length()){
compare = s.substring(k, k+i);
}else{
compare = s.substring(k);
}
if(!compare.equals(base))
break;
dup++;
j=k;
}
if(dup>1){
sb.append(dup+base);
}else{
sb.append(base);
}
}
if(answer>sb.length()) {
answer = sb.length();
}
}
return answer;
}
}
다른 풀이
by 송동훈 , choiyeonseok (programmers)
class Solution {
public int solution(String s) {
int answer = 0;
for(int i=1; i<=(s.length()/2)+1; i++){
int result = getSplitedLength(s, i, 1).length();
answer = i==1 ? result : (answer>result?result:answer);
}
return answer;
}
public String getSplitedLength(String s, int n, int repeat){
if(s.length() < n) return s;
String result = "";
String preString = s.substring(0, n);
String postString = s.substring(n, s.length());
// 불일치 -> 현재까지 [반복횟수 + 반복문자] 조합
if(!postString.startsWith(preString)){
if(repeat ==1) return result += preString + getSplitedLength(postString, n, 1);
return result += Integer.toString(repeat) + preString + getSplitedLength(postString, n, 1);
}
return result += getSplitedLength(postString, n, repeat+1);
}
}
Leave a comment