/ ALGORITHM

프로그래머스 - 문자열 압축 [2020 KAKAO BLIND RECRUITMENT]

카카오 블라인드 2020 문자열 압축 문제를 설명과 함께 풀이 합니다.

프로그래머스 - 문자열 압축

문제바로가기

문제유형

Brute-Force

문제 설명

주어진 문자열을 압축하는 문제

  1. aabbaccc => 2a2ba3c 각 중복되는 문자열앞에 중복개수를 붙여준다.
  2. 단 1개짜리 문자열은 개수를 붙이지 않는다.
  3. ababcdcdababcdcd => 경우 2ab2cd2ab2cd 보다 2ababcdcd 가 문자열 길이가 더 짧다.

결론 적으로는 각각의 케이스를 다 조사해서 제일 작은 문자열 길이를 리턴해야한다.

풀이법

처음에는 for문 하나에서 앞자리 문자와 다음 문자열을 비교 하면서 처리하려고 하였다.
aabbaccc케이스는 문자 1개씩만 비교하니 통과하는 로직이지만 ababcdcd == ababcdcd 비교 로직이 들어가야 되기 때문에 for문 하나로는 안된다. 결국 전체 케이스를 다 확인 해야한다.

aabbaccc를 압축 하는 예

aabbaccc
  1. a-a a-b b-b b-a a-c c-c c-c <= 한칸씩 옮겨가며 조합을 본다.
  2. aa-bb bb-ac ac-cc <= 두개씩 잘라서 조합을 본다.
  3. aab-bac bac-cc <= 3개씩 잘라서 조합을 본다.
  4. aabb-accc 4개씩 잘라서 조합을 본다.

총문자 열이 8개 이므로 1/2인 4개 즉 1~4개 까지 잘라서 비교해보는 로직을 구성하는 방법으로 해결한다.

소스코드

public class Lessons60057 {
    public static int solution(String s) {
        int result = s.length();

        for (int i = 1; i <= s.length() / 2; i++) {
            StringBuilder zipStr = new StringBuilder();
            String str = "", prevStr = "";
            int strCount = 1;

            for (int j = 0; j < s.length(); j += i) {
                str = s.substring(j, Math.min(j + i, s.length()));

                if (prevStr.equals(str)) {
                    strCount++;
                    continue;
                }

                zipStr.append(strCount > 1 ? strCount + prevStr : prevStr);
                prevStr = str;
                strCount = 1;
            }

            zipStr.append(strCount > 1 ? strCount + str : str);
            result = Math.min(result, zipStr.length());
        }

        return result;
    }
}
kimchanjung

김찬정

좀 더 넓은 TEST 커버리지! 좀 더 나은 Architecture! 좀 더 나은 Code Pattern! 보다 더 간결하고 깔끔한 코드!를 항상 갈망 합니다.

Read More