11. 문자열 압축
알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오. 단 반복횟수가 1인 경우 생략합니다.
첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.
첫 줄에 압축된 문자열을 출력한다.
===================================================
(1) 첫번째 풀이
처음 값을 저장하여 비교하기 시작하여 같다면 sum에 하나씩 추가하고 다르다면 바뀐 알파벳을 저장하고 그전의 알파벳과 sum을 출력한다.
import java.util.Scanner;
public class Main {
public String solution(String sentence) {
String answer="";
char [] array=sentence.toCharArray();
char t=array[0];
int sum=0;
for(int i=0;i<sentence.length();i++) {
if(array[i]==t) {
sum++;
}
else {
t=array[i];
if(sum==1) {
answer+=array[i-1];
}
else {
answer+=array[i-1];
answer+=sum;
}
sum=1;
}
}
if(sum==1) {
answer+=array[sentence.length()-1];
}
else {
answer+=array[sentence.length()-1];
answer+=sum;
}
return answer;
}
public static void main(String[] args) {
Main main = new Main();
Scanner scan = new Scanner(System.in);
String sentence=scan.next();
System.out.println(main.solution(sentence));
}
}
(2) 두번째 풀이
값을 저장하지 않고 다음 것과 비교하여 같다면 cnt를 하나씩 추가한다. 다르다면 answer에 현재 위치의 알파벳을 저장하고 cnt가 1보다 크다면 String.valueOf( ) 을 이용하여 answer에 저장한다. 마지막으로 answer을 반환한다.
import java.util.*;
class Main {
public String solution(String s){
String answer="";
s=s+" ";
int cnt=1;
for(int i=0; i<s.length()-1; i++){
if(s.charAt(i)==s.charAt(i+1)) cnt++;
else{
answer+=s.charAt(i);
if(cnt>1) answer+=String.valueOf(cnt);
cnt=1;
}
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str=kb.next();
System.out.println(T.solution(str));
}
}
1) charAt( ) 을 잘 활용 할 것
2) int형을 String으로 변환