import java.util.*;
class Solution {
    public int solution(String s) {
        int min = Integer.MAX_VALUE;
        for(int length = 1;length <= s.length();length++){
            min = Math.min(min, compress(length, s));
        }
        return min;
    }
    
    private static int compress(int length, String source){
        String pre = "";
        int cnt = 0;
        StringBuilder sb = new StringBuilder();
        for(String token : split(length, source)){
            if(pre.equals(token)){
                ++cnt;
            }else{
                if(cnt > 1){
                    sb.append(cnt);
                }
                sb.append(pre);
                pre = token;
                cnt = 1;
            }
        }        
        if(cnt > 1){
            sb.append(cnt);
        }
        sb.append(pre);
        return sb.toString().length();
    }
    
    private static List<String> split(int length, String source){
        List<String> tokens = new ArrayList<>();
        for(int i=0;i<source.length();i+=length){
            int lastIndex = i + length;
            if(lastIndex > source.length()) lastIndex = source.length();
            tokens.add(source.substring(i,lastIndex));
        }
        //System.out.print(tokens);
        return tokens;
    }
}

250926

나 자신을 못믿었군;;;

  • 30분내로 못품
  • 혼자 못품
  • 틀림
  • 마지막 토큰 처리 누락.
import java.util.*;
class Solution {
    public int solution(String s) {
        
        //l은 자를 문자열 길이
        int ans = Integer.MAX_VALUE;
        for(int l=1 ; l<=s.length() ; l++){
            List<String> tokens = new ArrayList<>();
            for(int i=0 ; i<s.length() ; i+=l){
                if(i+l > s.length()){
                    tokens.add(s.substring(i));
                    break;
                }
                tokens.add(s.substring(i, i+l));
            }
            
            //토큰 얻음. 이제 압축한다.
            String preToken = "";
            int seqCount = 0;
            StringBuilder sb = new StringBuilder();
            for(String token : tokens){
                //현재 토큰이 이전과 같다면 seq ++, 
                if(token.equals(preToken)){
                    seqCount++;
                }else{// a a b c
                    //이때는 압축시킨다. 압축한거 붙이면된다.
                    if(seqCount >= 2){
                        sb.append(seqCount);
                    }
                    seqCount = 1;
                    preToken = token;
                    sb.append(token);
                }
            }
            ans=Math.min(ans,sb.length());
        }
         return ans;
    }
    //문자열 잘라 압축한 문자열중 가장 짧은것.
    //브루트포스: 1~n길이까지 잘라본다...
    //n개로 자른다. replaceAll쓰면 안된다. 처음부터 무조건 짤라야하낟.
    //처음부터 짜른다면 자르는건 문제가 안되고 이걸 압축할때...
    //abc 가 2개 연속있다면 2abc -> 2(이거 길이계산) + 3(자른문자열 길이)
    //1개면 그대로 둔다.
}
import java.util.*;
 
class Solution {
    public int solution(String s) {
        int ans = Integer.MAX_VALUE;
 
        for (int l = 1; l <= s.length(); l++) {
            List<String> tokens = new ArrayList<>();
            for (int i = 0; i < s.length(); i += l) {
                if (i + l > s.length()) {
                    tokens.add(s.substring(i));
                } else {
                    tokens.add(s.substring(i, i + l));
                }
            }
 
            String preToken = "";
            int seqCount = 0;
            StringBuilder sb = new StringBuilder();
 
            for (String token : tokens) {
                if (token.equals(preToken)) {
                    seqCount++;
                } else {
                    if (!preToken.equals("")) { // 이전 토큰 처리
                        if (seqCount > 1) sb.append(seqCount);
                        sb.append(preToken);
                    }
                    preToken = token;
                    seqCount = 1;
                }
            }
 
            // 마지막 토큰 처리
            if (!preToken.equals("")) {
                if (seqCount > 1) sb.append(seqCount);
                sb.append(preToken);
            }
 
            ans = Math.min(ans, sb.length());
        }
 
        return ans;
    }
}