본문 바로가기
알고리즘 문제/Java

[프로그래머스/Java] 문자열 압축

by 현장 2026. 5. 14.

-Code

import java.util.*;

class Solution {
    public int solution(String s) {
        int strLen = s.length();
        int answer = strLen;
        // 중복되려면 같은 길이의 문자열이 2개 이상 존재해야 함
        for (int splitLen = 1; splitLen <= strLen / 2; splitLen++) {
            int cnt = 1;
            // 첫 부분 셋팅
            String before = s.substring(0, splitLen);
            // 나눌 길이로 나누어 문자열 생성
            StringBuilder convStr = new StringBuilder();
            for (int i = splitLen; i < strLen; i += splitLen) {
                // 인덱스 오류를 제거가히 위한 마지막 위치 셋팅
                int end = Math.min(i + splitLen, strLen);
                // 현재 문자열 생성
                String now = s.substring(i, end);
                if (!before.equals(now)) {
                    // 현재와 이전 문자열이 다른 경우
                    if (cnt > 1) {
                        // 1초과인 경우에만 cnt 추가
                        convStr.append(cnt);
                    }
                    // 이전 문자열 추가 후 이전 문자열 변경
                    convStr.append(before);
                    before = now;
                    // 갯수 초기화
                    cnt = 1;
                } else {
                    // 같은 문자열이므로 cnt만 증가
                    cnt++;
                }
            }
            // 마지막 문자열이 존재하면 추가
            if (cnt > 1) convStr.append(cnt);
            convStr.append(before);
            // 최소 길이인 경우 answer 변경
            answer = Math.min(answer, convStr.length());
        }
        return answer;
    }
}

1개씩 하는 방식을 구상하고 생각이 막혀서 이후로 시간 초과 문제가 날까 등 여러 생각으로 진행을 못하다가 알고 보니 그냥 똑같이 나눌 길이만 변경해서 진행하면 되는 문제였습니다. 

추가로 초기 값 셋팅에서 cnt와 for문으로 문자열을 만든 후 마지막 문자열이 존재한 경우에도 세팅을 해야 하는데 이 부분도 적용하지 않아서 한 번 더 틀렸었습니다.