컴퓨터 공학/백준

[백준] JAVA 자바 : 문자열 분석 (10820번)

kim-dev 2024. 1. 20. 11:55
반응형

N개 줄의 문자열을 입력받아서 각 줄마다 소문자, 대문자, 공백, 숫자의 개수를 출력하는 문제다.

사실 크게 어렵지는 않은… 그것도 심지어 브론즈 문제인데 꽤나 헤맸다.
왜냐하면 난 BufferedReader으로는 EOF를 처리해본 적이 없거든…
그래서 찾아본 결과 while문의 조건으로 br.readLine()을 넣어준 후 다음 줄의 문자열이 존재할 경우 계속 돌리다가 더 이상 입력받을 줄이 없다면 null이 들어오므로 그 때 반복을 중지하는 형태였다.

그 외에는 뭐… ASCII코드로 공백, 소문자, 대문자, 숫자를 각각 구분해서 배열에 문자를 만날 때마다 각 빈도 수를 하나씩 늘려가는 형태로 쉽게 짤 수 있을 듯?

import java.io.*;

public class AnalyzeString_10820 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        String str;
        while ((str = br.readLine()) != null) { // EOF 처리를 위해 줄이 비어있으면 반복을 멈추도록 한다
            sb.setLength(0); // StringBuilder 초기화
            int[] n_list = {0, 0, 0, 0}; // 줄 마다 개수를 세야 하므로 빈도 수 초기화
            
            for (int i=0; i<str.length(); i++) {
                int c_num = (int)str.charAt(i);
                if (c_num == (int)' ') { // 공백일 경우
                    n_list[3]++;
                    continue;
                } else if ((int)'A' <= c_num && c_num <= (int)'Z') { // 대문자일 경우
                    n_list[1]++;
                    continue;
                } else if ((int)'a' <= c_num && c_num <= (int)'z') { // 소문자일 경우
                    n_list[0]++;
                    continue;
                } else {
                    n_list[2]++; // 숫자일 경우
                    continue;
                }
            }
            
            for (int i=0; i<n_list.length; i++) {
                sb.append(Integer.toString(n_list[i]));
                sb.append(" ");
            }
            System.out.println(sb);
        }
    }

}

 

 

로그인

 

www.acmicpc.net

 

 

작성일자: 2023-09-05