알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는
문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.
public class Compression {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//String input = in.next();
String input = "KSTTTSEEKFKKKDJJGG";
solution2(input);
}
//while을 이용한 풀이
public static void solution(String input){
char p = '가';
StringBuilder sb = new StringBuilder();
char[] chars = input.toCharArray();
for(int i=0; i<chars.length; i++){
int idx = 1;
char c = chars[i];
if(p!=c){
p = c;
sb.append(c);
}else{
while(i<=chars.length){
idx++;
i++;
if(i>=chars.length){
i--;
break;
}
char d = chars[i];
if(p!=d){
i--;
break;
}
}
sb.append(idx);
}
}
System.out.println(sb.toString());
}
//문자열에 마지막 공백을 추가하는 방법
public static void solution2(String input){
input = input+" ";
StringBuilder sb = new StringBuilder();
int idx = 1;
char[] chars = input.toCharArray();
for(int i=0; i<chars.length-1; i++){
char c1 = chars[i];
char c2 = chars[i+1];
if(c1==c2) idx++;
else{
sb.append(c1);
if(idx>1)sb.append(idx);
idx = 1;
}
}
System.out.println(sb.toString());
}
}
2가지 풀이로 풀었는데
1번은 내가 생각했던 방식이다. 너무 어이가 없는 방식이긴 하다. 문자열 탐색하려고 이중 포문을 돌려야한다니... 내가 풀면서도 이건 아닌거 같았다.
2번은 강의에 나온 내용인데. 내가 1번을 풀면서 아 이렇게 말고 배열의 전까지 돌려서 값을 낼수 있지 않을까? 싶어서 풀어보다가 포기했었다. 그 이유는 마지막 배열에 대한 처리를 어떻게 해야할지 모르겠어였었다. 근데 강의를 보니 똑같은 내용에 맨 뒤에 " " 공백 하나를 더 주어서 배열의 크기 자체를 늘렸더라... 진짜 대단하다... 저런 생각은 문제를 풀면서 늘려야할거 같다.
마지막 배열을 탐색하기 어렵다면 마지막 배열을 임의로 추가해서 해결하자!