본문으로 바로가기

[level2] 문자열 압축 JAVA

category 카테고리 없음 2022. 11. 17. 17:24

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문자열을 1, 2 ~ 개 단위로 쪼개어 같은 단어들을 압축하는 방식으로 진행했을때 압축 후 문자열의 길이가 제일 적은 것을 리턴하는 문제이다.  간단한 문제라고 생각하고 풀었는데,, 결과는 ㅜㅜ

class Solution {
    static int answer = Integer.MAX_VALUE;
	public int solution(String s) {
	
		int n = s.length();
		
		if(n == 1) return 1;
		
	    for(int i = 1; i <= n/2; i++) {
	    	dfs(s, i);
	    }
	    
	    System.out.println(answer);
		return answer;
	}
	
	private void dfs(String s, int n) {
		 
		String str = s.substring(0, n);
		int len = n;
		int cnt = 0;
		
		s = s.substring(n);
		
		while(s.length() >= n) {
			String tmp = s.substring(0, n);
			if(str.equals(tmp)) {
				if(cnt == 0) { 
					cnt++; len +=1; 
				}
			} else {
				cnt = 0;
				str = tmp;
				len += n;
			}
            
            if(len >= answer) return;
			s = s.substring(n);
		}
		
		
		if(s.length() > 0) len+= s.length();
		
		answer = Math.min(len, answer);
	}
}

* 문제가 쉽다고 느껴질 수록 정확성을 놓치는 것 같다..

 

- 다시 한 번 문제를 살펴 봤을 때,, 발견한 나의 오류

바로 나는 숫자에는 len+=1 로 길이를 추가했던것!!!

숫자 자릿수로 길이를 추가하니 성공~!! 문제는 늘 꼼꼼하게 풀자~!

** len += (int)(Math.log10(cnt)+1); ** 

 

[최종 답안]

class Solution {
   static int answer = Integer.MAX_VALUE;
	public int solution(String s) {
	
		int n = s.length();
		
		if(n == 1) return 1;
		
	    for(int i = 1; i <= n/2+1; i++) {
	    	dfs(s, i);
	    }
	    
	    System.out.println(answer);
		return answer;
	}
	
	private void dfs(String s, int n) {
		 
		String str = s.substring(0, n);
		int len = n;
		int cnt = 1;
		
		s = s.substring(n);
		
		while(s.length() >= n) {
			String tmp = s.substring(0, n);
			if(str.equals(tmp)) {
				cnt++;
			} else {
				if(cnt > 1) {
					len += (int)(Math.log10(cnt)+1);
				}
				cnt = 1;
				str = tmp;
				len += n;
			}
            
            if(len >= answer) return;
			s = s.substring(n);
		}
		
		if(cnt > 1) len += (int)(Math.log10(cnt)+1);
		
		System.out.println(s.length());
		if(s.length() > 0) len+= s.length();
		
		answer = Math.min(len, answer);
	}
}