본문 바로가기

Algorithm

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

반응형

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

https://programmers.co.kr/learn/courses/30/lessons/60057

문제 접근

긴 문자열의 길이를 줄이기위해서 문자열을 n개 단위로 잘라서 같은 문자열 str이 n번 반복되면 nstr로 표현하여 압축하는 문제이다.
compressString 함수를 만들어서 압축하려는 문자열 s와 자르려는 문자열의 길이 len을 받아서 s를 len단위로 잘라 압축한 문자열의 길이를 반환하도록 하였다.

Code

class Solution {
    public int solution(String s) {
        int answer = s.length();
        for(int i = 1; i<=s.length()/2; i++){
            answer = Math.min(answer, compressString(s,i));
        }
        return answer;
    }
    /**
    * 문자열 s를 len길이만큼 잘라서 압축한 뒤, 압축한 문자열의 길이를 반환한다.
    */
    public int compressString(String s, int len){
        StringBuilder sb = new StringBuilder();
        String prev = s.substring(0,len);
        int cnt = 1;
        int i;
        for(i = len; i<s.length(); i+=len){
            String cur;
            if(i+len>s.length()){
                cur = s.substring(i,s.length());
            } else {
                cur = s.substring(i,i+len);
            }

            if(prev.equals(cur)){
                cnt++;
            }
            else{
                if(cnt == 1){
                    sb.append(prev);
                } else {
                    sb.append(cnt).append(prev);
                    cnt = 1;
                }
            }
            prev = cur;
        }
        // 마지막은 검사를 안하니까 한번 더 검사했다.
        if(cnt != 1){
            sb.append(cnt).append(prev);
        } else {
            sb.append(prev);
        }

        return sb.toString().length();
    }
}

어려웠던 점 / 배운 점 / 느낀 점

막혔던 부분은 만약 문자열의 길이가 11인 문자열을 딱 떨어지지않는 3이나 4로 잘랐을 때, len보다 작은 길이의 문자열이 남았을 때 이것을 처리하지 못해서 틀렸는데 의외로 쉽게 생각하고 아래 코드를 추가하니까 풀렸다. 너무 어렵게 생각하고 이상하게 접근했던 것 같다.

if(i+len>s.length()){
cur = s.substring(i,s.length());
} else {
cur = s.substring(i,i+len);
}

반응형