
처음 풀이
1. 단위를 1 ~ 전체길이의 절반까지 1씩 증가하면서 압축한다.
2. 압축된 최소 길이만 구하면 되기 때문에, 단위 크기로 자른 후 앞과 같은지 다른지 비교 후,
같으면 갯수를 1 증가, 다르면 현재까지 같았던 갯수의 자릿수와 단위 크기를 더해준다.
solution()
public int solution(String s) { int length = s.length(); //길이가 1일 땐 1 리턴 if (length==1) return 1; int min = Integer.MAX_VALUE; //절반 길이까지 단위 크기를 늘려가면서 압축 길이 갱신 for (int i = 1; i <= length / 2; i++) { min = Math.min(min, getShortLength(s, i)); }//for end return min; }//solution() end
getShortLength()
//단위 크기대로 압축 후 길이 리턴 public int getShortLength(String s, int cutSize) { //압축된 길이 int answer = 0; //이전 구간의 String : 첫 구간 String으로 초기화 String prevStr = s.substring(0, cutSize); //전체 길이 int length = s.length(); //같은 구간 갯수 : 1로 초기화 int sameCnt = 1; //두 번째 구간부터 시작 for (int i = cutSize; i < length; i+=cutSize) { //현재 구간의 String String now = null; try { now = s.substring(i, i+cutSize); } catch (Exception e) { //endIndex가 길이 넘어갈 때 (즉, 갯수가 딱 안맞을 때) now = s.substring(i); } finally { if (now.equals(prevStr)) { //이전 구간 String과 같을 때 //갯수 +1 sameCnt++; } else { //이전 구간 String과 다르면 //구간 사이즈만큼 압축 길이 증가 answer += cutSize; if (sameCnt!=1) { //1개가 아니라면, sameCnt의 자릿수만큼 압축 길이 증가 answer += String.valueOf(sameCnt).length(); } //1로 초기화 sameCnt = 1; //현재 구간의 String으로 prevStr 갱신 prevStr = now; } } }//for end //마지막 구간에 대한 압축 길이 처리 if (sameCnt!=1) { //마지막 구간이 전 구간과 같다면 //같은 갯수 자릿수와 단위 크기만큼 증가 answer += cutSize; answer += String.valueOf(sameCnt).length(); } else { //다르면 마지막 구간의 길이만큼 증가 answer += prevStr.length(); } return answer; }
다른 풀이 (참고)
- 재귀적으로 함수를 호출하면서 실제 압축된 문자열을 구한다.
solution()
StringBuilder sb = new StringBuilder(); public int solution(String s) { int length = s.length(); if (length==1) return 1; int min = Integer.MAX_VALUE; //절반 길이까지 단위 크기를 늘려가면서 압축 길이 갱신 for (int i = 1; i <= length/2; i++) { //sb 초기화 sb.setLength(0); getShortStr(s, i, 1); min = Math.min(min, sb.length()); }//for end return min; }//solution() end
getShortStr() - 재귀
//압축 문자열 리턴 (재귀) public void getShortStr(String s, int cutSize, int sameCnt) { //s 길이가 단위 크기보다 작으면 s를 append if (s.length()<cutSize) { sb.append(s); return; } //비교대상 (남은 문자열의 앞 구간) String prefix = s.substring(0, cutSize); //앞 구간을 제외한 나머지 문자열 String rest = s.substring(cutSize, s.length()); if (rest.startsWith(prefix)) { //나머지 문자열의 앞이 비교대상과 일치할 때 //sameCnt 1 증가시키고, 나머지 문자열을 인자로 하면서 재귀 호출 getShortStr(rest, cutSize, sameCnt+1); } else { //일치하지 않는 경우 if (sameCnt!=1) { //같은 갯수가 1이 아닐 때만 sameCnt append sb.append(String.valueOf(sameCnt)); } //비교대상 append sb.append(prefix); //나머지 문자열을 인자로, sameCnt는 1로 초기화하면서 재귀 호출 getShortStr(rest, cutSize, 1); } }//getShortStr() end
'자료구조 & 알고리즘 > 문제풀이' 카테고리의 다른 글
안정적인 문자열 - 백준 4889 (Java) (0) | 2022.08.11 |
---|---|
스킬트리 - 프로그래머스 (Java, Level 2) (0) | 2022.08.05 |
땅따먹기 - 프로그래머스 (Java, Level 2) (0) | 2022.08.05 |
디스크 컨트롤러 - 프로그래머스 (Java, Level 3) (0) | 2022.08.05 |
프린터 - 프로그래머스 (Java, Level 2) (0) | 2022.08.04 |
댓글