본문 바로가기

Java/Java 알고리즘 인프런

[Ch.01 - String] 11. 문자열 압축 (+ 공백 활용)

반응형
11. 문자열 압축
 

설명

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는

문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.

단 반복횟수가 1인 경우 생략합니다.

입력

첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.

출력

첫 줄에 압축된 문자열을 출력한다.

 

예시 입력 1 

KKHSSSSSSSE

예시 출력 1

K2HS7E

 

예시 입력 2 

KSTTTSEEKFKKKDJJGG

예시 출력 2

KST3SE2KFK3DJ2G2

import java.util.*;

public class Main {
	public String solution(String str) {
		String answer = "";
		str += " ";

		char[] arr = str.toCharArray();
		int tmp = 1;
		for (int i = 0; i < str.length() - 1; i++) {
			if (arr[i] == arr[i + 1])
				tmp++;
			else {

				answer += arr[i];
				if (tmp >= 2)
					answer += tmp;
				tmp = 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));
	}
}

 

import java.util.*;

public class Main {
	public String solution(String str) {
		String answer = "";
		char[] arr = str.toCharArray();
		int cnt = 1;

		for (int i = 0; i < str.length(); i++) {
			if (i != str.length()-1&&arr[i] == arr[i + 1]) {
				cnt++;
			} else {
				answer += arr[i];
				if (cnt >= 2) {
					answer += 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));
	}
}

 

import java.util.Scanner;

public class Main {
	public String solution(String str) {
		String answer = "";
		char[] arr = str.toCharArray();
		int n = 1;
		for (int i = 0; i < arr.length; i++) {
			if (i != arr.length - 1 && arr[i] == arr[i + 1]) {
				n++;
			} else {
				answer += arr[i];
				if (n > 1)
					answer += n;
				n = 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));
	}
}

 

import java.util.Scanner;
  
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    String input1 = in.next();
    System.out.println(solution(input1));
  }
  static String solution(String s){
    String answer="";
    char c=' ';
    int n=1;
    //반복횟수 1은 제외하고, 나타내기
    for(int i=0;i<s.length();i++){
      if(c==s.charAt(i)){
        n++;
      }
      else{
        if(c!=' ')
        answer+=c;
        if(n!=1)
        answer+=n;
        
        c=s.charAt(i);
        n=1;
      } 
    }
    answer+=c;
    if(n!=1) answer+=n;
   
    return answer;
  }
}

 

+) 세련된 풀이

1. 문자열에 끝에 공백을 넣어서, 맨 끝 바로 앞까지 돌아도 되게 변경

s = s + " ";

for (int i = 0; i < s.length() - 1; i++) {

2. int형 변수인 cnt를 직접 String에 추가하는 방법

answer += String.valueOf(cnt);

 

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));
	}
}

 

char [] to String 변환 메서드

1. charAt()

2. toCharArray()

 

str.charAt(i)

: String의 i번째 문자

 

String.valueOf(i)

: int to String 변환

 

 

 

import java.util.Scanner;
  
public class Main {
  public static void main(String[] args){
    Scanner in=new Scanner(System.in);
    String str= in.next();
    String answer="";
    char tmp=' ';
    int cnt=1;
    for(char c:str.toCharArray()){
      if(tmp==c){
        cnt++;
      }else{
        if(tmp!=' ')answer+=tmp;
        if(cnt!=1)answer+=cnt;
        cnt=1;
        tmp=c;
      }
    }
    answer+=tmp;
    answer+=cnt;
    System.out.println(answer);
  }
}
반응형