본문 바로가기
알고리즘

Programmers - 문자열 압축(Java)

by 장중앙 2021. 12. 16.

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

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

풀이

같은 값이 연속해서 나타나는 경우 반복되는 갯수를 표기하며 줄여서 표기 ex) aaa -> 3a 

* 단, 정해진 길이가 반복되는 경우만 압축가능 ex) aabbb -> 2a3b(X) -> 2a2bb(O)

 

* 완전 탐색으로 가장 작은 길이의 결과를 구하되, 탐색의 범위를 줄이는 것이 필요

주어지는 문자열의 길이를 이용하여 최대 압축 길이를 구함, 이 때 최대 압축 길이는 압축 할 수 있는 최대의 단위 길이

  ex) abacs라는 5의 길이를 가진 문자열은 3이상의 길이를 가진 문자로는 압축 불가

 

최대 압축 길이는 문자열 길이/2(소수점 내림) +1로 구할 수 있다.

 

1 ~ 최대 압축길이까지 압축 단위 길이 별로 탐색하여 문자를 압축하며 확인, 가장 적은 길이를 가진 문자열을 탐색

class Solution {
    public int solution(String s) {
        int answer = 1000;
        int len = s.length();
        
        // 길이가 1이라면 탐색의 필요 X
        if(len==1){
            return 1;
        }
        
        // 1~최대 압축 길이까지의 기준으로 문자열 압축
        for(int split=1; split<len/2 + 1; split++){
            String str = new String();
            // 0 ~ 압축 길이 만큼의 문자열 분리 
            String comp = s.substring(0, split);
            int cnt=1;
            
            for(int i=split;i<len;i+=split){
            	// 현재 탐색의 분리 문자열이 초기 문자열의 길이를 넘어간다면
                if(i+split>len){
                    // 이전 까지의 비교를 결과에 포함
                    if(cnt>1)
                        str+=cnt+comp;
                    else
                        str+=comp;
                    // 현재 부터 남은 문자열을 끝에 추가
                    comp = s.substring(i);
                    cnt=1;
                    continue;
                }
                // 현재(i~split)의 문자열과 비교 문자열 비교
                else if(comp.equals(s.substring(i, i+split)))
                    cnt++;
                
                else{
                    if(cnt>1)
                        str+=cnt+comp;
                    else
                        str+=comp;
                    comp = s.substring(i, i+split);
                    cnt=1;
                }
            }
            
            if(cnt>1)
                str+=cnt+comp;
            else
                str+=comp;
            
            // 최소 길이 결과 갱신
            if(answer>str.length()){
                answer=str.length();
            }
        }
        return answer;
    }
}

'알고리즘' 카테고리의 다른 글

BOJ 2638 - 치즈(Java)  (1) 2021.12.20
ALGOSPOT - Synchronizing Clocks(JAVA)  (0) 2021.12.16
BOJ 16234 - 인구 이동(Java)  (0) 2021.12.14
BOJ 11000 - 강의실 배정(Java)  (0) 2021.12.07
Programmers - 카카오프렌즈 컬러링북(JAVA)  (0) 2021.12.03

댓글