Algorithm

[Algorithm] 문자열 압축

씬프 2021. 6. 6. 13:30
반응형

프로그래머스 문제

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

 

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

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

programmers.co.kr

풀이

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = s.length();
        
        // 단위가 1부터 s.length() 까지
        for (int len = 1; len < s.length(); len++) {
            // 단위별 압축된 문자열 저장
            String comp = "";
            // 시작할 때 문자열
            String pre = s.substring(0, len);
            // 카운트, 숫자를 넣으면 aa -> 2a로 숫자칸 확보하고 시작
            int cnt = 1;
            // 스트링 len만큼씩 자르면서 
            for (int i = len; i < s.length(); i += len) {
                // len만큼의 문자열 호출
                String sub = "";
                for (int j = i; j < i + len; j++) {
                    if (j < s.length()) sub += s.charAt(j);
                }
                // pre와 sub 비교 같다면, cnt++, 다르다면 pre에 새로운 pre를 부여함
                if (pre.equals(sub)) cnt++;
                else {
                    comp += (cnt >= 2) ? cnt+pre : pre;
                    sub = "";
                    for (int j = i; j < i + len; j++) {
                        if (j < s.length()) sub += s.charAt(j);
                    }
                    pre = sub;
                    cnt = 1;
                }
            }
            // 남은 문자열
            comp += (cnt >= 2) ? cnt + pre : pre;
            answer = Math.min(answer, comp.length());
        }
        
        return answer;
    }
}

 

 

substring으로 푼 풀이

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = s.length();  
        for (int len = 1; len < s.length(); len++) {
            int cnt = 1;
            String comp = "";
            String prev = s.substring(0, len);
            for (int i = len; i < s.length(); i += len) {
                String now = "";
                if (i + len < s.length()) {
                    now = s.substring(i, i+len);
                } else {
                    now = s.substring(i);
                }
                
                if (prev.equals(now)) {
                  cnt++;
                }
                else {
                    comp += (cnt >= 2) ? cnt+prev : prev;
                    prev = now;
                    cnt = 1;
                }
            }
            comp += (cnt >= 2) ? cnt + prev : prev;
            answer = Math.min(answer, comp.length());
        }

        return answer;
    }
}

'Algorithm' 카테고리의 다른 글

[Algorithm] 치킨 배달  (0) 2021.06.08
[Algorithm] 기둥과 보 설치  (0) 2021.06.07
[Algorithm] 자물쇠와 열쇠  (0) 2021.06.05
[Algorithm] 문자열 재정렬  (0) 2021.06.04
[Algorithm] 무지의 먹방 라이브  (0) 2021.06.03