[프로그래머스(Programmers)] 2020 KAKAO BLIND RECRUITMENT:: 문자열 압축 (java)

2
post-thumbnail

안녕하세요. 오늘은 프로그래머스의 문자열 압축문제를 풀어보려고 합니다. 이 문제는 2020년도 KAKAO BLIND RECRUITMENT에서 출제되었습니다.!!


문제 링크

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

문제 풀이

✔ 핵심 코드 설명

👉 압축 전 압축하고자 하는 String s 정제

주어진 String s를 압축하려는 길이(i) 대로 잘라서 String배열에 차례로 넣어줍니다. 이 때 String배열의 길이는 s의 길이를 i(압축하려는 길이)로 나눈 값이 됩니다.

👉 압축 function

s를 정제해서 새로운 String배열인 str에 넣고 나서 compress function을 수행합니다. compress함수에서는 str배열의 길이만큼 for문을 돌면서 str[i-1]과 str[i]가 같은지 확인하고, StringBuilder를 이용해서 결과를 뒤에 붙입니다.

✔ 추가 테스트 케이스

테스트케이스문자열 압축결과
"xxxxxxxxxxyyy""10x3y"5
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx""100x"4
"zxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx""z100x"5
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz""100xz"5
"a""a"1

해당 테스트 케이스를 참고하여 제 코드에서 잘못된 곳을 찾을 수 있었습니다. 마지막케이스인 "a"의 경우 answer에 처음 초기화한 Integer.MAX_VALUE값이 그대로 남아있었는데, answer를 return하기 전 if문을 추가해 해당 문제를 해결하였습니다.

전체 코드

class Solution {
    public int solution(String s) {
        int answer = Integer.MAX_VALUE;

        for (int i = 1; i <= s.length() / 2; i++) {
            int len = s.length() % i != 0 ? s.length() / i + 1 : s.length() / i;
            String[] str = new String[len];

            for (int j = 1; j < str.length; j++) {
                str[j - 1] = s.substring((j - 1) * i, j * i);
                if (j == str.length - 1) {
                    str[j] = s.substring(j * i, s.length());
                }
            }

            String compress = compress(str);
            answer = answer > compress.length() ? compress.length() : answer;
        }

        if (answer == Integer.MAX_VALUE) answer = 1;
        return answer;
    }

    private String compress(String[] splStr) {
        int idx = 1;
        String before = splStr[0];
        StringBuilder sb = new StringBuilder();

        for (int i = 1; i < splStr.length; i++) {
            if (before.equals(splStr[i])) {
                idx++;
            } else {
                if (idx == 1) {
                    sb.append(before);
                    idx = 1;
                } else {
                    sb.append(idx + before);
                    idx = 1;
                }
            }

            before = splStr[i];
        }

        if (idx == 1) {
            sb.append(before);
        } else {
            sb.append(idx + before);
        }

        return sb.toString();
    }
}

느낀점

✔ 테스트 케이스의 중요성

처음에 코드를 제출해보니 딱 한 케이스가 틀려서 굉장히 아쉬웠고, 어떤 부분이 틀렸는지 찾기가 힘들었습니다. 평소에는 문제에서 주어진 테스트 케이스만 이용헤서 문제를 푼 후 다른 분들이 올려둔 테스트 케이스를 추가로 확인했었는데, 다음부터는 다양한 테스트 케이스를 직접 생각해서 적용해봐야겠다고 느꼈습니다.


[참고한 곳]
https://programmers.co.kr/questions/14862

2개의 댓글

comment-user-thumbnail
2021년 9월 29일

좋은 글이네요 도움이 많이 됐습니다 ;)

1개의 답글