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

문제보기

문제 자체는 이해하기 어렵지 않았던 것 같습니다.
다만 주의할 점은, 한번만 반복될때 1은 생략할것처음부터 일정갯수만큼 잘라야 한다는것 입니다.
자세한 내용은 주석으로~!

class Solution {
     public int solution(String s) {
        int n = s.length(); // 주어진 문자열의 길이 
        int answer = n; // 최댓값으로 초기화 해줌 

	// unit은 반복되는 문자의 단위를 말합니다. 최소 1개부터 최대 n/2개까지 조사해줍니다 
	//(n/2개를 넘어가면 문자열 갯수가 더 줄어들일이 없으므로 의미없음)
        for(int unit =  1 ; unit <= n/2 ; unit++){
            StringBuilder res = new StringBuilder(); // 압축된 결과를 담을 변수 
            StringBuilder sb = new StringBuilder(s); // 문자열 편집이 많아질것 같아서 스트링빌더로 받았습니다

            String word = sb.substring(0, 0+unit); // 반복될 문자열 - 초기값으로는 맨 앞을 unit개만큼 잘랐습니다
            sb.delete(0, 0+unit); // 방금 추출된 만큼 자릅니다

            while(sb.length() > 0){ // 문자열 끝까지 반복합니다

                int repeat = 1; // 해당 word가 반복되어 나타난 갯수를 저장 
                while(true) {

                    String next = "";

                    try {
                        next = sb.substring(0, 0+unit); // 자르고 남은 sb에서 다음 unit개의 문자열이 무엇인지 받습니다

                    }catch (Exception e) { // 길이가 모자라 next 추출시 에러가 난 경우는 이렇게 처리합니다

                        if(repeat != 1) { 
                            res.append(repeat);
                        }
                        res.append(word);
                        res.append(sb.toString());

                        sb.delete(0, 0+unit);
                        break;
                    }

                    sb.delete(0, 0+unit); // next를 추출한 만큼 다시 sb의 앞부분을 잘라줍니다 
                    if(next.toString().equals(word.toString())) { // 만일 word와 같다면 
                        repeat++; // 반복된 갯수를 +1 
                    }else { // 만일 word와 다르다면 
			// 여태껏 저장된 repeat과 word를 res에 저장합니다
			// 단, repeat이 1인 경우는 1을 생략해야합니다
                        if(repeat != 1) {
                            res.append(repeat);
                        }
                        res.append(word);
			// 그리고 방금 만든 next는 새로운 word가 되어주어야 합니다
                        word = next; 
                        repeat = 1; // 초기화
			// 만약 더이상 남은 sb가 존재하지 않는다면 
			// 방금 가져온 next는 res에 추가된 채로 종료되어야 합니다 
                        if(sb.length() == 0) {
                            res.append(word);
                        }
			// 해당 반복문을 종료하고 새로운 word로 탐색해줍니다 
                        break;
                    }
                }
            }    
	
	    // 만일 res의 길이가 answer보다 작다면 갱신합니다 
            int len = res.length();
            if(len < answer){
                answer = len;
            }
        }

        return answer;
    }
}

Tags:

Categories:

Updated:

Comments