class Solution {
public static int solution(String s){
int answer = s.length();
int len; // 각 단위마다 압축한 결과 길이
String str1; String str2; // 비교할 문자열
int start1; int start2; // 문자열 자를 인덱
boolean rpt; // 반복 스위치
int cnt; // 반복 횟수
for (int i=1; i<=(s.length()/2); i++){
len = s.length();
start1 = 0; start2 = i; // substring 시작 위치
rpt = false; cnt = 0; // 각 변수 초기화
while((start2+i) <= s.length()) {
str1 = s.substring(start1, start1+i);
str2 = s.substring(start2, start2+i);
if (str1.equals(str2)){
if (!rpt) { //첫 반복
cnt++; // 첫 반복
rpt = true; // 반복 스위치 on
}
len -= i; // 압축
cnt++; // 반복 횟수 증가
}
else {
if (rpt){ // 반복이 끝난 직후에만 len 변화; 반복되지 않으면 len 압축 없음
len += count_digit(cnt); // xxxxxxxxxx -> 10x처럼 앞에 붙는 숫자 자릿수 만큼 길이 증가
rpt = false; cnt = 0; // 변수 다시 초기화
}
}
start1+=i; start2+=i; // 뒤로 i칸 옮기기
} // end of while
if (rpt) { // 마지막까지 비교했는데 반복 스위치 on 된 상태로 끝났을 때 마지막 털기
len += count_digit(cnt);
}
if (answer > len) answer = len; // 압축한 문자열 길이 최소값으로 갱신
} // end of for
return answer;
}
static int count_digit(int i){ // 자릿수 세기
int digit = 0;
do {
i = i/10;
digit++;
} while(i>0);
return digit;
}
}
처음 틀렸던 이유는 문제를 제대로 이해하지 못해서였다.
테스트케이스 5번을 제대로 봤으면 처음부터 간단하게 짰을 텐데...
입출력 예 #5
문자열은 제일 앞부터 정해진 길이만큼 잘라야 합니다.
따라서 주어진 문자열을 x / ababcdcd / ababcdcd 로 자르는 것은 불가능 합니다.
이 경우 어떻게 문자열을 잘라도 압축되지 않으므로 가장 짧은 길이는 17이 됩니다.
가능한 줄 알고 코드를 더 복잡하게 짜놓고 생각을 아예 처음부터 다시 했다. 앞으로는 문제부터 잘 보기...^^
앞에서부터 i개 단위로 자르고 뒤에 나머지는 그냥 압축 생각 안 해도 되는 거였음
두번째로 틀렸던 이유는... 열 번 이상 반복될 때도 그냥 len +=1; 을 해버려서였다.
이분 덕에 자릿수 리턴하는 메소드 하나 만들어서 해결했다
1, 2번 해결한 이후 세번째도 있답니다... 마지막까지 반복된 경우를 생각 안 해서!!!
코드 엎으면서 이 경우를 빼버린 것이었다 다시 추가해줘서 드디어 맞았음
어려운 문제는 아니었는데... 좀 꼬여서 오래 걸렸다
//사용법
String.substring(start) //start위치부터 끝까지 문자열 자르기
String.substring(start,end) //start위치 부터 end전까지 문자열 발췌
//예제
String str = "ABCDEFG";
str.substring(3); // 결과값 = DEFG
str.substring(3, 6); // 결과값 = DEF