abcabcdede 는 길이가 10이다.
< 이해 해보자 >
"aabbaccc" —> 2a2ba3c
"ababcdcdababcdcd" —>
"xababcdcdababcdcd" —> 이 예제를 통해 헷갈리던 부분을 해결함
n 개 단위로 자른다고 한다면 idx?
걍 단순하게 생각나는 것
반복되는 문자열 중 " 가장 길이가 긴 것"
문자열의 "반복되는 수가 가장 많은 것 "
아 이 방식은 아니다. 그저 완전탐색을 해야 할 것 같다.
사용할 String class의 메소드 에 대한 고민
먼저 특정 문자열이 "연속해서 반복되는 횟수" 를 구하는 메소드 작성
str.substr(i,i+n)
update i= i +n
str.substr(i,i+n) 과 같은지를 확인.
public int checkRepeat(String s, int idx,int n){
// 기준은
String target = s.substr(idx,idx+n);
int cnt =0;
// 반복한다.
int i = idx+n;
while(i+n<=s.length){
String cur = s.substr(i,i+n);
if(cur.eqauls(target)) cnt++;
else break;
}
return cnt;
}
class Solution {
public int min = Integer.MAX_VALUE;
public int solution(String s) {
int answer = 0;
int len = s.length();
int totCnt =0; // 전체 문자열의 길이를 기록한다.
int curCnt =0; // 현재 문자열의 반복횟수를 기록한다.
// 모든 경우에 대한 탐색을 시행한다.
for(int n =1; n<=len;n++){
totCnt =0;
int startIdx=0;
while(startIdx+n<=s.length()){
curCnt = checkRepeat(s, startIdx, n);
startIdx+=n*curCnt;
totCnt+=n;
// 반복 된 경우, 반복 횟수도 길이에 더해줘야한다. 1이면 1, 11이면 2, 111이면 3을 더해줘야 한다.
if(curCnt>1) totCnt+=String.valueOf(curCnt).length();
}
// 남은 길이를 더해줘야 한다. 예를들어 예제 3번 처럼."abcabcdede"의 경우, idx 9의 경우 9 + 3 >10 이기 때문에, while문을 벗어난다.
// "e" 에 해당하는 길이를 더해줘야한다.
totCnt += (s.length()-startIdx);
if(totCnt<min) {
min = totCnt;
}
}
answer = min;
return answer;
}
// idx부터 idx+n 까지의 문자열이 반복되는지 구한다.
// 리턴 값이 1인 경우 --> 반복이 없다 .
// 리턴 값이 1보다 큰 경우 --> 반복하는 횟수가 리턴된다.
public int checkRepeat(String s, int idx, int n){
if(idx+n>s.length()) return 1;
String target = s.substring(idx,idx+n);
int cnt = 1;
int i = idx+n;
while(i+n<=s.length()){
String next = s.substring(i,i+n);
if(next.equals(target)) {
i+=n;
cnt++;
}
else break;
}
return cnt;
}
}
int len = String.valueOf(length);
를 하였는데 생각해보면
log10(111) 의 경우 2 가 나온다. 그러니 여기다 1만 더해주면 됨
log10(9) + 1 은 1이니 한 자리 수 라는게 맞다.
int len = Math.log10(length)+1;