Algorithm

[Algorithm/Java] 알고리즘 자바 문자열 압축 (코딩테스트, String, 문자열, 문자 중복, 문자 개수 세기)

권락현 2022. 3. 19. 11:25


1. 문제 설명

  • 설명 : 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오. 단 반복 횟수가 1인 경우 생략합니다.
  • 입력 : 첫 줄에 문자열이 주어진다. 문자열의 길이는 100을 넘지 않는다.
  • 출력 : 첫 줄에 압축된 문자열을 출력한다.

 

2. 문제 코드 및 풀이 설명

import java.util.Scanner;

public class StringCompression {
  public static void main(String[] args) {
    StringCompression T = new StringCompression();
    Scanner kb = new Scanner(System.in);
    String s = kb.next();
    System.out.println(T.solution2(s));
  }

  // 해결방법 (혼자 풀어본 것)
  // 입력받은 문자열을 문자배열로
  // 배열을 돌며 같은 문자가 나오면 카운트
  // 다른 문자면 문자 출력, 카운트는 1이 아닐때만 출력
  public String solution(String s) {
    String answer = "";
    char c = ' '; // 비교를 위해 미리 빈 문자 삽입
    s += " "; // 마지막 문자 출력을 위해 빈 문자 더해줌
    int n = 1;
    for (char x : s.toCharArray()) {
      if (x == c) { // 앞 문자와 같다면 카운트만 증가
        n++;
      } else {
        if (n == 1) { // 앞 문자와 다르고 카운트가 1이라면 문자만 출력
          answer += x;
          c = x;
        } else { // 앞 문자와 다르고 카운트가 2이상이라면 둘 다 출력
          answer += n;
          answer += x;
          c = x;
          n = 1; //숫자 출력 후 카운트 초기화
        }
      }
    }
    return answer;
  }

  // 해결방법 2
  // 아이디어는 위와 비슷
  public String solution2(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); //카운트가 1보다 클때만 출력
        cnt = 1;
      }
    }
    return answer;
  }
}

 

3. 출력 예시

입력
AAABBBCDEFFFF

출력
A3B3CDEF4

 


위의 내용은 인프런에서 수강할 수 있는 김태원님의 자바 알고리즘 문제풀이 강의를 바탕으로 공부한 내용을 정리한 내용입니다!

https://inf.run/iAi6

 

자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의

자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성

www.inflearn.com