알고리즘/백준

공부 90일차: 백준 10820번 문자열 분석 자바 Java

김발자~ 2022. 10. 28. 22:21
반응형

10820 문자열 분석

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

 

10820번: 문자열 분석

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

www.acmicpc.net

 

 

 


백준 10820번 문제 문자열 분석


문제


 

 

 

 


과정 생각해보기


 

1. n을 어떻게 구할 것인가

지금까지 보았던 많은 문제들은 총 몇 줄이 입력되는지 알려주어서 그만큼 반복문을 돌리는 구문이 필요했는데,이 문제의 경우 n은 그냥 주어진 문자열이 끝날 때 결정된다

 

2. 각각의 소문자 대문자 숫자 공백이 경우 매우 간단하다

문자열을 받아서 문자 하나하나마다 소문자인지 대문자인지 숫자인지 공백인지 확인한 후count의 개수를 늘려주면 된다

 

이렇게만 하면 끝나는 간단한 문제

 

 

 


오답


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), "\n");
        //br.readLine()은 어차피 줄로 구분해서 StringTokenizer로 구분이 안 됨
 
        while(st.hasMoreTokens()) {
            String str = st.nextToken();
            // 소문자 대문자 숫자 공백
            int lower = 0;
            int upper = 0;
            int number = 0;
            int blank = 0;
            
            for(int i = 0; i < str.length(); i++) {
                if('a'<=str.charAt(i) && str.charAt(i)<='z') {    //소문자
                    lower++;
                } else if('A'<=str.charAt(i) && str.charAt(i)<='Z') { //대문자
                    upper++;
                } else if('0'<=str.charAt(i) && str.charAt(i)<='9') {    //숫자
                    number++;
                } else if(str.charAt(i) == ' ') {    //공백
                    blank++;
                }
            }
            
            System.out.print(lower+" "+upper+" "+number+" "+blank+"\n");
        }
 
    }
 
}
 
cs

 

횟수를 정확히 알 수 없으므로 while문에 넣고 비교해봤는데 계속 첫 번째 줄만 출력됐다

StringTokenizer로 "\n", 즉 줄바꿈으로 구분해보려 했으나 사실 br.readLine()이 한 줄씩 입력받기 때문에 소용없었던 것..

다 치고 나서야 그걸 상기했다..

 

 

 


정답 인정 코드


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String str = null;
        
        while((str = br.readLine()) != null){
            // 소문자 대문자 숫자 공백
            int lower = 0;
            int upper = 0;
            int number = 0;
            int blank = 0;
            
            for(int i = 0; i < str.length(); i++) {
                if('a'<=str.charAt(i) && str.charAt(i)<='z') {    //소문자
                    lower++;
                } else if('A'<=str.charAt(i) && str.charAt(i)<='Z') { //대문자
                    upper++;
                } else if('0'<=str.charAt(i) && str.charAt(i)<='9') {    //숫자
                    number++;
                } else {    //공백
                    blank++;
                }
            }
            System.out.println(lower+" "+upper+" "+number+" "+blank);
        }
        br.close();
    }
}
cs

 

주석으로 설명 붙일 만한 구간 없이 무난했다

몇 번 반복되는지 모르므로 while문의 표현식 안에 str = br.readLine()을 넣는 게 지금껏 못본 패턴인 듯

 

 


알파벳 찾기는 단계별 문제 풀어보기에서 했었던 문제라 이 문제로 넘어왔다

반응형