프로그래머스 문자열압축 (Java,자바)

jonghyukLee·2021년 8월 29일
0

오늘 풀어본 문제는
프로그래머스 문자열압축 입니다.

📕 문제 링크

❗️코드

import java.util.*;
class Solution {
    public int solution(String s) {
        if(s.length() < 2) return 1;
        int answer = Integer.MAX_VALUE;
        for(int i = 1; i <= s.length()/2; ++i)
        {
            StringBuilder sb = new StringBuilder();
            answer = Math.min(compress(s,sb,i),answer);
        }
        return answer;
    }
    static int compress(String origin, StringBuilder cur,int len)
    {
        ArrayList<String> al = new ArrayList<>();
        for(int i = 0; i < origin.length(); i+=len)
        {
            if(i+len > origin.length()) al.add(origin.substring(i));
            else al.add(origin.substring(i,i+len));
        }
        String pre = al.get(0);
        int cnt = 1;
        for(int i = 1; i < al.size(); ++i)
        {
            if(pre.equals(al.get(i))) cnt++;
            else
            {
                if(cnt > 1)
                {
                    cur.append(cnt).append(pre);
                    pre = al.get(i);
                    cnt = 1;
                }
                else
                {
                    cur.append(pre);
                    pre = al.get(i);
                }
            }
        }
        if(cnt > 1) cur.append(cnt).append(pre);
        else cur.append(pre);

        return cur.length();
    }
}

📝 풀이

중복된 문자열 패턴을 찾아 압축하는 문제입니다.
문자열 길이의 절반이 넘어가면 중복값이 나올 수 없으므로 length/2 까지만 진행합니다.
함수에 len값을 넘겨주면, ArrayList에 해당 길이만큼 문자열을 분리하여 담습니다.
ArrayList를 탐색하며 이전 문자열과 비교하여 카운트값 + 문자열 또는 기존 문자열을 StringBuilder에 붙여 새로운 문자열을 만들어나갑니다.
마지막 문자열은 pre에 남아있게 되므로, 반복문을 벗어난 이후 붙여줍니다.
마지막으로 StringBuilder에 완성된 문자열의 길이를 반환해주고,
변수 answer에 최솟값을 저장합니다.

📜 후기

문제를 처음 보고 재귀를 사용하려 했는데, 문자열 최대길이가 1000이길래 생각보다 짧네? 하고 생각나는대로 그냥 짜봤습니다. 한방에 통과해서 다행이네요 ㅋㅋㅋㅋㅋ

profile
머무르지 않기!

0개의 댓글