이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static String solution(String str) {
        StringBuilder result = new StringBuilder();
        int count = 1;

        for (int i = 1; i < str.length(); ++i) {
            if(str.charAt(i) == str.charAt(i - 1)) ++count;
            else
            {
                result.append(str.charAt(i - 1));
                if(count > 1) result.append(count);
                count = 1;
            }
        }
        result.append(str.charAt(str.length() - 1)); //마지막 문자 처리
        if(count > 1) result.append(count);
        return result.toString();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

  • StringBuilder result = new StringBuilder();
    결과 문자열을 효율적으로 만들기 위해 StringBuilder 객체를 생성한다. StringBuilder는 문자열을 추가할 때 성능이 뛰어나다.
  • int count = 1;
    현재 연속된 문자의 개수를 저장하는 변수 count를 초기화한다. 최초에는 1로 시작한다.
  • for (int i = 1; i < str.length(); ++i)
    문자열의 두 번째 문자부터 마지막 문자까지 순회한다. 첫 번째 문자와 비교하기 위해 인덱스 i를 1부터 시작한다.
  • if (str.charAt(i) == str.charAt(i - 1))
    - 현재 문자(str.charAt(i))가 이전 문자(str.charAt(i - 1))와 같은지 비교한다.
    - 같으면 count를 1 증가시킨다. 즉, 연속된 문자의 개수를 증가시킨다.
  • else 블록 -> 현재 문자가 이전 문자와 다르면
    - result.append(str.charAt(i - 1)) : 이전 문자를 결과 문자열에 추가한다.
    - if (count > 1) result.append(count); : count가 1보다 크면, 연속된 문자의 개수를 결과 문자열에 추가한다.
    - count = 1 : count를 다시 1로 초기화한다.
  • 마지막 문자 처리 -> 반복문이 종료된 후, 마지막 문자를 처리하기 위해
    - result.append(str.charAt(str.length() - 1)) : 마지막 문자를 결과 문자열에 추가한다.
    - if (count > 1) result.append(count); : 마지막 문자가 여러 번 연속된 경우, 그 개수를 결과 문자열에 추가한다.