[Programmers] level 2 - 문자열 압축 (2020 KAKAO BLIND RECRUITMENT)

Lynn·2021년 2월 18일
0

Algorithm

목록 보기
32/43
post-thumbnail

👩🏻‍💻 문제

👩🏻‍💻 정답 코드

class Solution {
    public static int solution(String s){
        int answer = s.length();

        int len; // 각 단위마다 압축한 결과 길이
        String str1; String str2; // 비교할 문자열
        int start1; int start2; // 문자열 자를 인덱
        boolean rpt; // 반복 스위치
        int cnt; // 반복 횟수

        for (int i=1; i<=(s.length()/2); i++){
            len = s.length();
            start1 = 0; start2 = i; // substring 시작 위치
            rpt = false; cnt = 0; // 각 변수 초기화

            while((start2+i) <= s.length()) {
                str1 = s.substring(start1, start1+i);
                str2 = s.substring(start2, start2+i);
                if (str1.equals(str2)){
                    if (!rpt) { //첫 반복
                        cnt++; // 첫 반복
                        rpt = true; // 반복 스위치 on
                    }
                    len -= i; // 압축
                    cnt++; // 반복 횟수 증가
                }
                else {
                    if (rpt){ // 반복이 끝난 직후에만 len 변화; 반복되지 않으면 len 압축 없음
                        len += count_digit(cnt); // xxxxxxxxxx -> 10x처럼 앞에 붙는 숫자 자릿수 만큼 길이 증가
                        rpt = false; cnt = 0; // 변수 다시 초기화
                    }
                }
                start1+=i; start2+=i; // 뒤로 i칸 옮기기
            } // end of while

            if (rpt) { // 마지막까지 비교했는데 반복 스위치 on 된 상태로 끝났을 때 마지막 털기
                len += count_digit(cnt);
            }
            if (answer > len) answer = len; // 압축한 문자열 길이 최소값으로 갱신 
        } // end of for
        return answer;
    }

    static int count_digit(int i){ // 자릿수 세기
        int digit = 0;
        do {
            i = i/10;
            digit++;
        } while(i>0);
        return digit;
    }
}

❗️

처음 틀렸던 이유는 문제를 제대로 이해하지 못해서였다.
테스트케이스 5번을 제대로 봤으면 처음부터 간단하게 짰을 텐데...

입출력 예 #5
문자열은 제일 앞부터 정해진 길이만큼 잘라야 합니다.
따라서 주어진 문자열을 x / ababcdcd / ababcdcd 로 자르는 것은 불가능 합니다.
이 경우 어떻게 문자열을 잘라도 압축되지 않으므로 가장 짧은 길이는 17이 됩니다.

가능한 줄 알고 코드를 더 복잡하게 짜놓고 생각을 아예 처음부터 다시 했다. 앞으로는 문제부터 잘 보기...^^
앞에서부터 i개 단위로 자르고 뒤에 나머지는 그냥 압축 생각 안 해도 되는 거였음

❗️❗️

두번째로 틀렸던 이유는... 열 번 이상 반복될 때도 그냥 len +=1; 을 해버려서였다.
이분 덕에 자릿수 리턴하는 메소드 하나 만들어서 해결했다

❗️❗️❗️

1, 2번 해결한 이후 세번째도 있답니다... 마지막까지 반복된 경우를 생각 안 해서!!!
코드 엎으면서 이 경우를 빼버린 것이었다 다시 추가해줘서 드디어 맞았음

어려운 문제는 아니었는데... 좀 꼬여서 오래 걸렸다


👩🏻‍💻 Remember

문자열 자르기 Substring

//사용법
String.substring(start) //start위치부터 끝까지 문자열 자르기
String.substring(start,end) //start위치 부터 end전까지 문자열 발췌

//예제
String str = "ABCDEFG";
str.substring(3); // 결과값 = DEFG
str.substring(3, 6); // 결과값 = DEF
profile
wanderlust

0개의 댓글

관련 채용 정보