[프로그래머스] 2020 KAKAO BLIND RECRUITMENT 문자열 압축
문제 자체는 이해하기 어렵지 않았던 것 같습니다.
다만 주의할 점은, 한번만 반복될때 1은 생략할것과 처음부터 일정갯수만큼 잘라야 한다는것 입니다.
자세한 내용은 주석으로~!
class Solution {
public int solution(String s) {
int n = s.length(); // 주어진 문자열의 길이
int answer = n; // 최댓값으로 초기화 해줌
// unit은 반복되는 문자의 단위를 말합니다. 최소 1개부터 최대 n/2개까지 조사해줍니다
//(n/2개를 넘어가면 문자열 갯수가 더 줄어들일이 없으므로 의미없음)
for(int unit = 1 ; unit <= n/2 ; unit++){
StringBuilder res = new StringBuilder(); // 압축된 결과를 담을 변수
StringBuilder sb = new StringBuilder(s); // 문자열 편집이 많아질것 같아서 스트링빌더로 받았습니다
String word = sb.substring(0, 0+unit); // 반복될 문자열 - 초기값으로는 맨 앞을 unit개만큼 잘랐습니다
sb.delete(0, 0+unit); // 방금 추출된 만큼 자릅니다
while(sb.length() > 0){ // 문자열 끝까지 반복합니다
int repeat = 1; // 해당 word가 반복되어 나타난 갯수를 저장
while(true) {
String next = "";
try {
next = sb.substring(0, 0+unit); // 자르고 남은 sb에서 다음 unit개의 문자열이 무엇인지 받습니다
}catch (Exception e) { // 길이가 모자라 next 추출시 에러가 난 경우는 이렇게 처리합니다
if(repeat != 1) {
res.append(repeat);
}
res.append(word);
res.append(sb.toString());
sb.delete(0, 0+unit);
break;
}
sb.delete(0, 0+unit); // next를 추출한 만큼 다시 sb의 앞부분을 잘라줍니다
if(next.toString().equals(word.toString())) { // 만일 word와 같다면
repeat++; // 반복된 갯수를 +1
}else { // 만일 word와 다르다면
// 여태껏 저장된 repeat과 word를 res에 저장합니다
// 단, repeat이 1인 경우는 1을 생략해야합니다
if(repeat != 1) {
res.append(repeat);
}
res.append(word);
// 그리고 방금 만든 next는 새로운 word가 되어주어야 합니다
word = next;
repeat = 1; // 초기화
// 만약 더이상 남은 sb가 존재하지 않는다면
// 방금 가져온 next는 res에 추가된 채로 종료되어야 합니다
if(sb.length() == 0) {
res.append(word);
}
// 해당 반복문을 종료하고 새로운 word로 탐색해줍니다
break;
}
}
}
// 만일 res의 길이가 answer보다 작다면 갱신합니다
int len = res.length();
if(len < answer){
answer = len;
}
}
return answer;
}
}
Comments