티스토리 뷰

728x90

문제

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

 

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

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

programmers.co.kr

 

풀이 및 소스코드

 

저번에 푸려다가 포기한 문제였는데, 내가 문제를 잘못 이해했기 때문이었다.

문자열 2개로 압축시 0번째+1번째, 2번째+3번째 이렇게 비교만 해주면되는건데

나는 0번째+1번째와 2번째+3번째가 다르면 1번쨰+2번째와 3번째+4번째를 비교해줘야하는 줄 알았다.

무튼 ..

 

"aabbaccc" 인 경우 2개 단위로 잘라 압축한다고 가정,

변수 설명

tmp : sb와 비교. 2개 단위로 잘린 이전 문자열

sb : 문자 하나하나 넣어준다. 크기가 i가 될때까지. (현재 i==2) 현재 문자열로 보면 된다.

ressb : 압축결과 담는 곳

 

위 설명에서 동일했던 묶음에 해당하는 변수가 tmp이고, 다른요소에 해당하는 변수가 sb라고 생각하면 된다.

 

class Solution {
    public int solution(String s) {
        int answer = 1000;
        int n = s.length();
        StringBuilder sb;
        if(n == 1) return 1;
        for(int i=1;i<=n/2;i++) {
        	sb = new StringBuilder();
        	String tmp=null;
        	int cnt = 1;
        	StringBuilder ressb = new StringBuilder();
        	for(int j=0;j<=n;j++) {
        		if(j<n) sb.append(s.charAt(j));
        		if(j+1 == i) {
        			tmp = sb.toString();
        			sb = new StringBuilder();
        		}
        		else if(j%i == i-1 || j == n) { //비교요소 끝
        			if(tmp.equals(sb.toString())) {
        				sb = new StringBuilder();
        				cnt++;
        			}else {
        				if(cnt == 1) {
        					ressb.append(tmp);
        					
        				}else {
        					ressb.append(cnt).append(tmp);
        					cnt = 1;
        				}
        				tmp = sb.toString();
        				sb = new StringBuilder();
        			}
        		}
        	}
        	if(tmp.length()!=0) {
    			ressb.append(tmp);
    		}
        	answer = Math.min(answer, ressb.length());
        	
        }
        return answer;
    }
}

 

반응형