코딩테스트

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

mingg123 2021. 4. 17. 20:36

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

 

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

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

programmers.co.kr

 

1차 코드 (실패)

class Solution {
    public int solution(String s) {
        int answer = 1001;
		for(int i = 1; i <= s.length()/2; i++) {
			String result = "";
			int prefix = 1;
			String now, next = "";
			for(int j = 0; j<= s.length(); j++) {
				int start, end = 0;
				start = i * j;
				end = i * (j + 1);
				if(end > s.length()) end = s.length();
				now = next;
				if(start > s.length()) {
					result = result + Integer.toString(prefix) +  now;
					break;
				}
					next = s.substring(start, end);
				if(now.equals(next)) {
					prefix ++;
				} else {
					result = result + Integer.toString(prefix) +  now;
					prefix = 1;
				}
			}
			result = result.replaceAll("1", "");
			answer = (Math.min(answer, result.length()));
		}

		return answer;
    }
}

 

원인은 replaceAll("1", "") 이였다.

 

이유는 만약 10a10b가 나오면 replaceAll시 0a0b가 되기 때문.

 

이걸 깨닫지 못하고 헤맸다.

 

2차 코드 (성공)

class Solution {
    public int solution(String s) {
		if(s.length() == 1) return 1;
		int answer = 1001;
		for(int i = 1; i <= (s.length()/2) ; i++) {
			String result = "";
			int prefix = 1;
			String now, next = "";
			for(int j = 0; j<= s.length() /i; j++) {
				int start, end = 0;
				start = i * j;
				end = i * (j + 1) > s.length() ? s.length() : i * (j + 1);
				now = next;

				next = s.substring(start, end);

				if (now.equals(next)) {
					prefix++;
				} else {
					if (prefix <= 1) {
						result = result + now;
					} else {
						result = result + (prefix) + now;
					}
					prefix = 1;
				}
			}
            if (prefix <= 1) {
                result = result + next;
            } else {
                result = result + (prefix) + next;
            }
			// result = result + (prefix) + next;

			answer = (Math.min(answer, result.length()));
		}

		return answer;
    }
}

 

 

또 한가지 주의해야 할 점은 if문을 한번 더 태우면 run Time 에러가 발생했다. 

class Solution {
    public int solution(String s) {
		if(s.length() == 1) return 1;
		int answer = 1001;
		for(int i = 1; i <= (s.length()/2) ; i++) {
			String result = "";
			int prefix = 1;
			String now, next = "";
			for(int j = 0; j<= s.length() /i; j++) {
				int start, end = 0;
				start = i * j;
				// end = i * (j + 1) > s.length() ? s.length() : i * (j + 1);
                end = i * (j+1); 
                if(end > s.length()) end = s.length;
				now = next;

				next = s.substring(start, end);

				if (now.equals(next)) {
					prefix++;
				} else {
					if (prefix <= 1) {
						result = result + now;
					} else {
						result = result + (prefix) + now;
					}
					prefix = 1;
				}
			}
            if (prefix <= 1) {
                result = result + next;
            } else {
                result = result + (prefix) + next;
            }
			// result = result + (prefix) + next;

			answer = (Math.min(answer, result.length()));
		}

		return answer;
    }
}