알고리즘

[백준] 문자열 처리 - 10820번, 문자열 분석

hatch 2023. 10. 24. 16:39
728x90
반응형

문) 문자열 N개가 주어진다. 이때, 문자열에 포함되어 있는 소문자, 대문자, 숫자, 공백의 개수를 구하는 프로그램을 작성하시오. 각 문자열은 알파벳 소문자, 대문자, 숫자, 공백으로만 이루어져 있다.

입) 첫째 줄부터 N번째 줄까지 문자열이 주어진다. (1 ≤ N ≤ 100) 문자열의 길이는 100을 넘지 않는다.

출) 첫째 줄부터 N번째 줄까지 각각의 문자열에 대해서 소문자, 대문자, 숫자, 공백의 개수를 공백으로 구분해 출력한다.


풀이

이걸 쓰게 된 이유가 있다.

풀이는 매우 단순하므로 금방 작성했으나 <런타임 에러(Nullpointer)>에서 계속 걸리는 것이다.

 

무려 3번이나...^^.

패인은 null과 빈 문자열일 때의 경우, 둘 다 처리해야했는데 못한 것이다.

 

1~3회 모두 null이 아닌 경우만 != 연산자와 equals()함수를 사용해서 처리했음.

진짜 못 찾겠어서 질문 게시판을 뒤져봐도 안 나와서 챗 지피티한테 물었다. 흑흑.

<null이 아닌 동안 + 빈 문자열이 아닌 동안>에 루프가 돌아가게 해야 정상적으로 출력된다는 답변을 받았다.

 

코드

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

        String n;
        while((n = br.readLine()) != null && !n.isEmpty()) {
            int small = 0, big = 0, num = 0, blank = 0;
            for(int i=0; i<n.length(); i++) {
                char c = n.charAt(i);
                if(c >= 'a' && c <= 'z') small++;
                else if(c >= 'A' && c <= 'Z') big++;
                else if(c >='0' && c <= '9') num++;
                else blank++;
            }
            bw.write(small + " " + big + " " + num + " " + blank+"\n");
        }
        br.close();
        bw.flush();
        bw.close();
    }
}

슬프다

여러 경우의 수를 잘 살펴보자는 교훈을 얻었다. 하하.