반응형
설명
알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는
문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.
단 반복횟수가 1인 경우 생략합니다.
입력
첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.
출력
첫 줄에 압축된 문자열을 출력한다.
예시 입력 1
KKHSSSSSSSE
예시 출력 1
K2HS7E
예시 입력 2
KSTTTSEEKFKKKDJJGG
예시 출력 2
KST3SE2KFK3DJ2G2
첫 번째 풀이
문제 접근은 문자열을 압축할려면 같은 문자가 연속적으로 몇 번 반복되는지 체크를 하기 위해서 현재 문자와 다음 문자가 같다면 equalCount++ 를 증감해줬다.
equalCount를 1로 할당한 이유는 현재 문자는 한 번 연속된 것이라고 생각했다.
- 현재 문자(currentChar)와 다음 문자(nextChar)이 같지 않으면
- equalCount가 1이면 1일때는 압축한 문자만 answer.append() 했다.
- 다시 연속되는 문자를 찾기 위해서 eqaulCount를 1로 할당했다.
- 현재 문자(currentChar)와 다음 문자(nextChar)이 같으면
- equalCount가 1이 아니라면 압축한 숫자와 문자를 answer.append() 했다.
하단에 끝 문자(rear)와 끝에서 두 번째 문자(secondOfRear)를 비교한 이유는 입력값 (KKHSSSE) word의 length()가 7이라면 현재 for문은 length() - 1만큼 반복해서 마지막 S까지만 비교를 하고, 끝에 문자는 추가해주지 않기에 따로 작성해줬다.
package section01.E11_문자열_압축;
import java.io.*;
public class Main {
public String solution(String word){
// 입력 : 대문자로 이루어진 문자열 word <= 100
// 출력 : 압축된 문자열
StringBuilder answer = new StringBuilder();
int wordLength = word.length();
int equalCount = 1;
for (int i = 0; i < wordLength - 1; i++){
char currentChar = word.charAt(i);
char nextChar = word.charAt(i + 1);
if (currentChar == nextChar){
equalCount++;
} else {
if (equalCount == 1){
answer.append(currentChar);
} else {
answer.append(currentChar + "" + equalCount);
}
equalCount = 1;
}
}
// Ex) KKHSSSSSSSE => 맨 뒤에서 2번째 값 != 맨 뒤 값
// S != E
char rear = word.charAt(wordLength - 1);
char secondOfRear = word.charAt(wordLength - 2);
if (secondOfRear != rear){
answer.append(rear);
} else {
answer.append(secondOfRear + "" + equalCount);
}
return answer.toString();
}
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String word = br.readLine();
bw.write(T.solution(word));
bw.flush();
bw.close();
}
}
두 번째 방법
두 번째 방법에서는 첫 번째 방법의 if/else문 보다 분기문을 조금 더 줄였다.
현재문자(currentChar)와 다음문자(nextChar)이 같지 않을 때, 현재 문자는 answer.append()해주고, 연속되는 횟수(equalCount)가 1보다 크면 압축한 숫자도 append()를 해줬다.
위에서 따로 끝에 문자와 끝에서 두 번째 문자를 처리해주는 방법을 입력값(KKHSSSE) word에 " " 빈 공백을 하나 더 추가해줘서 끝까지 비교해주는 방법을 해결했다.
package section01.E11_문자열_압축;
import java.io.*;
public class MainA {
public String solution(String word){
StringBuilder answer = new StringBuilder();
word = word + " "; // ABCD이면 D까지 반복하기 위해서 끝에 "" 추가...ㅋㅋㅋ 꼼수
int equalCount = 1;
int wordLength = word.length();
for (int i = 0; i < wordLength - 1; i++){
char currentChar = word.charAt(i);
char nextChar = word.charAt(i + 1);
if (currentChar == nextChar){
equalCount++;
} else {
answer.append(currentChar);
if (equalCount > 1){
answer.append(equalCount);
}
equalCount = 1;
}
}
return answer.toString();
}
}
반응형