[BaekJoon] 1264번 - 모음의 개수 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 128MB


- 문제

영문 문장을 입력받아 모음의 개수를 세는 프로그램을 작성하시오. 모음은 'a', 'e', 'i', 'o', 'u'이며 대문자 또는 소문자이다.

- 입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 영어 대소문자, ',', '.', '!', '?', 공백으로 이루어진 문장이 주어진다. 각 줄은 최대 255글자로 이루어져 있다.
입력의 끝에는 한 줄에 '#' 한 글자만이 주어진다.

- 출력

각 줄마다 모음의 개수를 세서 출력한다.

- 예제

  입력      출력  
How are you today?
Quite well, thank you, how about yourself?
I live at number twenty four.
#
7
14
9





2. 풀이

while 반복문을 사용해 ‘#’ 입력전까지 무한 반복한다.

while (조건식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문 작성;
}




for 반복문을 사용해 문장의 길이만큼 반복하면서 모음의 개수를 체크한다.

for (초기식; 조건식; 증감식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문 작성;
}




2개의 입력방식을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스



2-1. Scanner 클래스

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        while(true){
            String str = sc.nextLine().toLowerCase(); // 소문자로 변환
            int count = 0;
            
            if(str.equals("#")){
                break;
            }
                
            for(int i=0;i<str.length();i++){
                char c = str.charAt(i);
                
                if(c=='a' || c=='e' || c=='i' || c=='o' || c=='u'){
                    count++;
                }
                
                // switch(str.charAt(i)){
                //      case 'a':
                //      case 'e':
                //      case 'i':
                //      case 'o':
                //      case 'u':
                //         count++;
                //         break;
                //      default:
                //         break;
                // }
            }
        
            System.out.println(count);
        }
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

int형 데이터를 입력받기 위해 nextInt() 메서드를 사용한다.

break; 는 감싸고 있는 제어문의 블록을 빠져 나오는 기능이다. (switch문 에서도 사용)
반복문에서는 주로 조건문(if)와 같이 사용하여 조건에 해당되는 경우 반복 수행을 종료한다.
여러 반복문이 중첩되어 있는 경우엔 break 문이 포함되어 있는 가장 가까운 반복문만 빠져 나온다.

charAt(i) 은 문자열의 i 번째 자릿수 (0부터 시작) 의 문자를 반환한다.

switch 조건문 은 case 실행문을 작동하고 종료하려면 break; 가 필수이다.
break; 가 없으면 조건과 일치하는 부분부터 break를 만나거나 종료되기 전까지 실행이 된다.
default 는 case 이외의 모든 조건을 포함한다.



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요




2-2. BufferedReader 클래스 사용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        while(true){
            String str = br.readLine().trim().toLowerCase(); // 소문자로 변환
            int count = 0;
            
            if(str.equals("#")){
                break;
            }
                
            for(int i=0;i<str.length();i++){
                char c = str.charAt(i);
                
                if(c=='a' || c=='e' || c=='i' || c=='o' || c=='u'){
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}

readLine() 을 사용해 ENTER 입력 전까지의 데이터를 한 줄로 읽어온다.
trim() 으로 문자열에 포함된 공백을 모두 제거한다.
toLowerCase() 로 문자열의 각 문자를 전부 소문자로 바꾼다.



[여기서 잠깐!]

BufferedWriter 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.





3. 성능 비교

image

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.





관련 페이지

Categories:

Updated:

Leave a comment