Algorithm/구현

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

간지나제 2021. 4. 2. 15:09

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

 

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

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

programmers.co.kr

 

문제는 이해한대로 순서대로 풀었다.

문자를 1개, 2개, ... , 문자열의 갯수만큼 자를 수 있으니까 그만큼의 for문을 돌렸고

그만큼 자르는 함수를 만들어서 갯수가 가장 작은 답을 return하게끔 했다.

 

크게 세 부분으로 나눌 수 있을 것 같다.

기본적으로 전에 자른 str과 현재의 str을 비교해서 다르면 전에 있는 str을 StringBulder에 넣고

만약 자르는 폭이 커서 문자열의 길이를 넘어가면 전에 가지고 있는 것을 넣고 나머지를 prev에 넣는다.

그리고 마지막에는 남는 것을  StingBuilder에 넣어준다.

 

최대한 쉽게 해결하려 했는데 중복되는 코드도 있고

뭔가 깔끔하게 해결하지 못한 느낌이다.

좀 더 깔끔하게 풀 수 있도록 정리 좀 해봐야겠다. 나중에....

 

 

 

public int solution(String s) {
        int answer = Integer.MAX_VALUE;
        
        for(int i=0; i<s.length(); i++) {
        	String str = splitString(i+1, s);
        	System.out.println(str);
        	if(str.length() < answer) {
        		answer = str.length();
        	}
        }
        
        return answer;
    }
	
	public String splitString(int unit, String str) {
		StringBuilder sb = new StringBuilder();
		String prev = str.substring(0, unit);
		int count = 1;
		
		for(int i=unit; i<str.length(); i+=unit) {
			if(i+unit > str.length()) {
				if(count >= 2) {
					sb.append(count);
				}
				sb.append(prev);
				count = 1;
				prev = str.substring(i);
				break;
			}
			String cur = str.substring(i, i+unit);
			if(!prev.equals(cur)) {
				if(count >= 2) {
					sb.append(count);
				}
				sb.append(prev);
				count = 0;
				prev = cur;
			}
			count++;
		}
		if(count >= 2) {
			sb.append(count);
		}
		sb.append(prev);		
		
		return sb.toString();
	}