알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - 2020 KAKAO BLIND RECRUITMENT - 문자열 압축

HRuler 2020. 11. 13. 21:56

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/60057?language=java

 

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

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

programmers.co.kr

2. 나의 풀이

import java.util.*;


class Solution {
    public int solution(String s) {
         int answer = s.length();
        StringBuilder sb1 = new StringBuilder(s);
        StringBuilder sb2 = new StringBuilder("");
        //System.out.println("sb2 : " + sb2);
        for(int i = 1; i <= s.length()/2; i = i + 1) {
        	String imsi = "";
        	int su = 0;
        	while(true) {
        		
        		if(imsi.equals(sb1.substring(0, i))) {
        			su++;
        			sb1.delete(0, i);
        		}else if(!imsi.equals(sb1.substring(0, i))){
        			if(su == 0) {
        				imsi = sb1.substring(0, i);
        				su++;
        				sb1.delete(0, i);
        			}else if(su == 1) {
        				sb2.append(imsi);
        				su = 0;
        			}else if(su > 1) {
        				sb2.append(su + imsi);
        				su = 0;
        			}
        			
        		}
        		
        		if(sb1.length() - i < 0) {
        			if(su == 1) {
        				sb2.append(imsi);
        				su = 0;
        			}else {
        				sb2.append(su + imsi);
        				su = 0;
        			}
        			sb2.append(sb1);
        			sb1.delete(0, sb1.length());
        			break;
        		}
        		
        		if(sb1.length() == 0) {
        			if(su == 1) {
        				sb2.append(imsi);
        				su = 0;
        			}else {
        				sb2.append(su + imsi);
        				su = 0;
        			}
        			break;
    			}
    			
        		//System.out.println("sb1 : " + sb1 + ", sb2 : " + sb2);
        		
        		
        	}

    		//System.out.println("TheEnd sb1 : " + sb1 + ", sb2 : " + sb2);
        	if(sb2.length() < answer) {
        		
    			answer = sb2.length();
    			//System.out.println("answer : " + answer);
    		}
        	sb1.append(s);
        	sb2.delete(0, sb2.length());
        }
        
        return answer;
    }
}

3. 다른 사람 풀이

class Solution {
    public int solution(String s) {
        int answer = 0;

        for(int i=1; i<=(s.length()/2)+1; i++){
            int result = getSplitedLength(s, i, 1).length();
            answer = i==1 ? result : (answer>result?result:answer);
        }

        return answer;
    }

    public String getSplitedLength(String s, int n, int repeat){
        if(s.length() < n) return s;
        String result = "";
        String preString = s.substring(0, n);
        String postString = s.substring(n, s.length());

        // 불일치 -> 현재까지 [반복횟수 + 반복문자] 조합
        if(!postString.startsWith(preString)){
            if(repeat ==1) return result += preString + getSplitedLength(postString, n, 1);
            return result += Integer.toString(repeat) + preString + getSplitedLength(postString, n, 1);
        }

        return result += getSplitedLength(postString, n, repeat+1);
    }
}