본문 바로가기
코딩테스트 준비/백준

[백준] 10820번 - 문자열 분석 [Java]

by mwzz6 2024. 12. 2.

https://www.acmicpc.net/problem/10820

 

[백준] 10820번 - 문자열 분석 [Java]


1.  아이디어

 

문자열에 포함된 소문자, 대문자, 숫자, 공백을 구분해서 개수를 구해야 하는데 이때 각각의 아스키 코드로 구분할 수 있는 점을 활용했다.


2. 문제풀이

 

아스키 코드 문자의 개수를 세는 카운팅 배열을 활용해서 각 문자의 개수를 전부 세고 이후 해당 범위의 개수의 합을 구하는 방식으로 구현했다.

 

카운팅 배열을 그냥 소문자, 대문자, 숫자, 공백 이렇게 4가지만 셀 수 있게 만들고 카운팅 배열에 넣을 때 조건을 걸어서 해결할 수도 있는데 이 방식이 가독성이 더 좋을 것 같았다.


3. 코드

 

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        String str;

        while ((str = br.readLine()) != null) {
            char[] input = str.toCharArray();
            int[] cntArr = new int[128];

            for (char c : input) {
                cntArr[c]++;
            }

            sb.append(sum(cntArr, 'a', 'z')).append(" ")
                    .append(sum(cntArr, 'A', 'Z')).append(" ")
                    .append(sum(cntArr, '0', '9')).append(" ")
                    .append(sum(cntArr, ' ', ' ')).append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
    }

    // 카운팅 배열의 구간합
    private static int sum(int[] arr, int start, int end) {
        int sum = 0;
        for (int i = start; i <= end; i++) {
            sum += arr[i];
        }
        return sum;
    }

}

4. 후기