Algorithm/Baekjoon(Java)

[백준/JAVA] 1152 : 단어의 개수 ( System.in.read(); )

비망노트 2022. 7. 25. 21:47
문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까?

이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다.

이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다.

또한 문자열은 공백으로 시작하거나 끝날 수 있다.

 

출력

첫째 줄에 단어의 개수를 출력한다.

예제 입력 예제 출력
The Curious Case of Benjamin Button 6
 The first character is a blank 6
The last character is a blank  6

 

⭕ 풀이

import java.util.*;
import java.io.*;

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());
        br.close();        
        System.out.print(st.countTokens());
    }
}

 

 

 

✅ 다른분의 풀이

import java.io.IOException;
 
public class Main {
    public static void main(String[] args) throws IOException {
    
        int count = 0;
        int pre_str = 32;	// 공백을 의미한다.
        int str ;
        
        while(true) {
            str = System.in.read();
            
            // 입력받은 문자가 공백일 때,
            if(str == 32) {
                // 이전의 문자가 공백이 아니면
                if(pre_str != 32) count++;
            }
            // 입력받은 문자가 개행일때 ('\n')
            else if(str == 10) {
                // 이전의 문자가 공백이 아니면
                if(pre_str != 32) count++;
                break;
            }
            pre_str = str;
        }
        System.out.println(count);
    }
}

1. System.in.read()로 한 문자씩 가져와서 비교한다.

 

2. 예제2번의 경우 첫str이 32이지만 이때 pre_str도 32이기때문에 count++는 하지않는다.

 

3. 다음 T를 받고 if와 else if 에도 들어갈 수 없으므로 마지막의 pre_str = str을 실행시켜 pre_str에 T의 아스키코드값을 할당한다.

 

4. pre_str은 h로 바뀌었다, e로 재할당된 뒤 다음문자인 공백을 입력받는다.

 

5. 이때는 첫반복과달리 pre_str의 값이 e의 아스키코드 값이므로 32가 아니다. count++을 실행시킨다.

 

6. 입력의 마지막 즉 입력값이 \n 개행이라면 , 근데 이전문자가 공백이 아닐경우 count++를 한 뒤 break로 탈출한다.

 

6-1 예제3번의경우 마지막에 공백이 하나 더 있는데 else if안에서 pre_str!=32 를 하지않고 count++를 했으면 

       결과는 틀렸다고 나왔을것이다.

 

7. 이렇게 탈출한뒤 count를 출력한다.

 

 

✅ System.in.read();

System.in.read() 메소드는 한 문자만 가져온다
단, 하나의 문자를 입력받아 입력받은 문자의 ASCII(아스키) Code 코드를 반환한다

 

 

 

 

-출처

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