💡Problem Solving/Programmers

[프로그래머스] 문자열 압축 (Java)

gom20 2021. 10. 25. 22:35

문제

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

 

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

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

programmers.co.kr

풀이

그냥 이중 반복으로 구현해서 풀었다. 

바깥쪽 반복문의 인덱스는 unit(자르는 단위의 개수)이다. 

내부는 while문을 추가해서 인덱스를 unit만큼 증가시키면서 현재와 이전 문자열을 비교해서 count를 계산하였다. 

 

소스코드(JAVA)

import java.util.*;

class Solution {
    
    public int solution(String s) {        
        int len = s.length(); 
        int answer = len; // 나눠지지 않을 경우 문자열의 길이가 답이 되므로 기본값으로 설정해 놓는다. 
        
        for(int unit = 1; unit <= len/2; unit++){ // 나누는 단위는 한 개부터 ~ 문자열 길이의 절반까지 될 수 있다.
            StringBuilder sb = new StringBuilder();
            int idx = 0, cnt = 0;
            String prev = "", cur ="";
            
            while(idx < len){ // idx가 len보다 작을 경우 반복한다.
                
                // 첫 번째 단위를 예외 처리한다.
                if("".equals(prev)){
                    // 첫 번째는 문자 단위를 prev에 넣고, idx는 unit을 더해 갱신해준다. 
                    // 해당 단위로 1개를 나눴으므로 cnt는 1을 할당한다.
                    prev = s.substring(idx, idx + unit);
                    idx = idx + unit;
                    cnt = 1;
                    continue;
                } 
                    
                // 마지막 단위를 예외처리 한다.
                if(idx + unit >= len){
                    cur = s.substring(idx);
                    if(cur.equals(prev)){
                        sb.append(cnt++).append(cur);
                    } else {
                        if(cnt > 1) sb.append(cnt);
                        sb.append(prev);
                        sb.append(cur);
                    }               
                    break;
                }
                
                // 해당 단위의 문자열이 이전 문자열과 동일한지 체크한다. 
                // 현재 문자열이 이전 문자열과 동일하다면 count를 증가시킨다.
                cur = s.substring(idx, idx + unit); 
                if(cur.equals(prev)){
                    cnt++;                     
                } else {
                    // 현재 문자열이 이전과 달라졌다면 이전 문자열과 count를 Buffer에 추가한다.
                    if(cnt > 1) sb.append(cnt);
                    sb.append(prev);
                    cnt = 1;
                    prev = cur;
                }               
                idx = idx + unit;             
            }
            answer = Math.min(sb.length(), answer);           
        } 
        return answer;
    }
}

 

소스코드(Python)

def solution(s):
    answer = 1001
    
    if len(s) == 1:
        return 1
    
    for unit in range(1, len(s)):

        # 문자열 끊기
        arr = []
        item = ''
        for i in range(len(s)):            
            item += s[i]
            if len(item) == unit:
                arr.append(item)
                item = ''
        
        if item != '':
            arr.append(item)
        
        # 반복되는 문자열 숫자 처리
        rs = ''
        prev = arr[0]
        cnt = 1
        last = len(arr)-1
        for i in range(1, len(arr)):
            if arr[i] == prev:
                cnt += 1
                if i == last:
                    rs += str(cnt) + prev
            else:
                if cnt == 1:
                    rs += prev
                else:
                    rs += str(cnt) + prev
                prev = arr[i]
                cnt = 1
                if i == last:
                    rs += prev
        
        answer = min(answer, len(rs))
    return answer