알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.
첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.
KSTTTSEEKFKKKDJJGG
첫 줄에 압축된 문자열을 출력한다.
KST3SE2KFK3DJ2G2
class Main {
public String solution(String str) {
int count = 1;
String result = "";
// str를 순회하면서 tmp와 같으면 count++,
// 같지않으면 현재 문자를 result에 저장하고, count가 2이상일 경우 같이 저장
// 공백이 포함되어 있으므로 그 전까지만 순회한다.
for(int i = 0; i<str.length()-1; i++) {
if(str.charAt(i) == str.charAt(i+1)) {
count++;
} else {
result += str.charAt(i);
if(count > 1) {
result += count;
count = 1;
}
}
}
return result;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String answer = T.solution(str);
System.out.println(answer);
}
}
💡 출력값이 KST3SE2KFK3DJ2G2
이 아닌KST3SE2KFK3DJ2
마지막 문자가 생략되는 문제가 발생하였다. 마지막 문자는 비교할 대상이 없어서 나타나는 문제였다.
class Main {
public String solution(String str) {
int count = 1;
String result = "";
// 마지막 문자는 비교할 대상이 없으므로 임의의 공백을 넣어준다.
str += " ";
for(int i = 0; i<str.length()-1; i++) {
if(str.charAt(i) == str.charAt(i+1)) {
count++;
} else {
result += str.charAt(i);
if(count > 1) {
result += count;
count = 1;
}
}
}
return result;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String answer = T.solution(str);
System.out.println(answer);
}
}
입력 받은 문자열에 임의의 공백을 두어, 마지막 문자가 생략되어도 출력에 문제가 없도록 하였다.
또한, 문자열의 마지막 문자는 다음 문자가 없어 StringIndexOutOfBoundsException
가 발생하므로 문자열의 마지막 문자의 인덱스 전까지 순회하도록 하였다.