문제 설명
접근 방법
- (1 단위로 압축 시) 문자열의 첫번째 문자를 가지고 두번째, 세번째 등 각각의 문자를 순서대로 비교하면서 일치하는지 여부를 검사합니다.
- (1번 검사 작업에 대해) 일치하는 경우 multiple 변수(초기값 1)의 값을 1씩 증가시킵니다.
- (1번 검사 작업에 대해) 일치하지 않는 경우 별도의 압축 문자열(zipString) 변수에 multiple 값(문자열 형태로)과 첫번째 문자를 추가 할당해줍니다.
- 이후 두번째 문자를 가지고 세번째, 네번째 등 각각의 문자를 순서대로 비교하면서 2~3번 작업을 반복합니다.
- 모든 문자를 비교했을 경우 2 단위로 압축하여 1~4번 작업을 반복합니다.
전체 소스 코드
class Solution {
public int solution(String s) {
int lengthOfString = s.length();
if (lengthOfString == 1) {
return 1;
}
StringBuilder zipString = new StringBuilder();
int result = 1000, multiple = 1, unit = 1, nextIndex = unit;
String currentString, nextString;
while (nextIndex + unit <= lengthOfString) {
currentString = s.substring(0, unit);
nextString = s.substring(nextIndex, nextIndex + unit);
while (nextIndex + unit <= lengthOfString - 1
&& nextIndex + unit * 2 <= lengthOfString) {
if (currentString.equals(nextString)) {
multiple++;
} else {
if (multiple == 1) {
zipString.append(currentString);
} else {
zipString.append(multiple).append(currentString);
multiple = 1;
}
}
currentString = s.substring(nextIndex, nextIndex + unit);
nextIndex += unit;
nextString = s.substring(nextIndex, nextIndex + unit);
}
if (currentString.equals(nextString)) {
multiple++;
nextIndex += unit;
}
if (multiple == 1) {
zipString.append(currentString);
} else {
zipString.append(multiple).append(currentString);
}
zipString.append(s.substring(nextIndex));
result = Math.min(result, zipString.length());
multiple = 1;
unit++;
nextIndex = unit;
zipString.setLength(0);
}
return result;
}
}
참고자료
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 튜플 - Java (0) | 2022.05.08 |
---|---|
[프로그래머스] 오픈채팅방 - Java (0) | 2022.05.06 |
[프로그래머스] 메뉴 리뉴얼 - Java (0) | 2022.04.10 |
[프로그래머스] 모음 사전 - Java (0) | 2022.04.09 |
[프로그래머스] 전력망을 둘로 나누기 - Java (0) | 2022.04.05 |