관리 메뉴

사과하는 제라스

[백준 BOJ 10951번] A+B-4 본문

JAVA 백준 알고리즘 문제풀이/반복문

[백준 BOJ 10951번] A+B-4

Xerath(제라스) 2022. 3. 28. 03:20

목차

    728x90
    반응형

    출처 : https://www.acmicpc.net/problem/10951

     

    10951번: A+B - 4

    두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

    www.acmicpc.net

     

    1. 문제

    두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.


    2. 입력

    입력은 여러 개의 테스트 케이스로 이루어져 있다.

    각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

    1 1
    2 3
    3 4
    9 8
    5 2

    3. 출력

    각 테스트 케이스마다 A+B를 출력한다.

    2
    5
    7
    17
    7

    4. 풀이

    이전 문제들을 참고하면 간단하지만 가장 중요한 부분은 종료 시점을 해결해내야 한다. 이 문제에서 파일 종료 조건이 없고 단순히 입력만 주어졌다. 이는 입력에서 더이상 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하란 뜻이다.

     

    BufferedReader의 경우엔 EOF를 null을 반환함으로서 던져준다. 그러니 쉽게 while문에서 br을 읽어와서 str에 넣고 그 str을 null과 비교하여 반복문(while)의 진행 여부를 결정할 수 있다.


    5. 소스코드

    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));
            String str;
            while((str = br.readLine()) != null){
                StringTokenizer st = new StringTokenizer(str);
                int A = Integer.parseInt(st.nextToken());
                int B = Integer.parseInt(st.nextToken());
                System.out.println(A+B);
            }
        }
    }

    6. 배운 것

     

    ----------------------------------------------------------------------------------------------------------------------

    • EOF 란?

    이 문제에서 가장 중요한 점이 파일 종료 조건이 없이 그냥 입력이 주어졌다는 것이다.

     입력에서 더이상의 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하라는 것이다.

     

    이렇게 데이터가 더이상 존재하지 않을 때 우리는 EOF (End of File) 즉, 파일의 끝이라 한다.

     

    이를 처리하는 방법은 입력의 종류에 따라 여러 방법이 있다. 우리는 그 중 Scanner  BufferedReader 두 개의 처리 방법을 알아보고자 한다.

    ----------------------------------------------------------------------------------------------------------------------

    •  Scanner  


    Scanner 의 메소드들의 경우 더이상 읽을 데이터가 없으면 아래 사진과 같이 
    NoSuchElementException 을 던지게 된다.

     


    보다시피 Scanner 에 읽을 데이터가 없으면 아래와 같이 예외를 던져버린다.

     

    이렇게 던져진 예외의 경우 두 가지 방법이 있다.

    try-catch 문으로 예외발생시 반복문을 종료해주도록 처리함.

    1. Scanner 의 메소드인 hasNext() 를 통해 처리해준다. 

    위의 방법 중에 우리는 hasNext() 라는 메소드를 이용할 것이다. 



    ※ 주의할 점

     백준 알고리즘에서는 데이터를 주는 과정에서 더이상의 데이터를 보내지 않음으로 NoSuchElementException 을 발생 시킬 수 있다. 그러나 우리가 평상시에 입력받는 방법인 System.in, 즉 키보드로 입력받을 경우 Scanner 는 우리가 흔히 쓰는 Enter, Space 도 입력 예외를 발생시키지 않는다. 쉽게 말하면 데이터로 무언가를 받아들인단 소리다.

     

    우리가 평상시에 입력받는 방식으로 예외처리를 하려면 \n 을 입력받거나 " "(공백) 을 입력받을 경우의 조건문을 걸어 예외를 발생시켜 종료시켜야하지만, 백준 문제처럼 파일 입력의 경우는 종료시점에서 더이상 데이터를 보낼 수가 없기 때문에 예외가 발생된다.

     

    특히 hasNext(), hasNextInt() 등 이런 메소드들로 처리해도 백준에서는 문제가 해결되는 이유가 더이상 데이터를 읽을 것이 없는경우 당연히 nextInt() 에서 받는 입력이 존재하지 않아 예외를 던져준다.

     

    그러나 IDE나 터미널에서 우리가 입력을 할 경우 공백이나 엔터를 치더라도 이 또한 입력 이벤트로 데이터가 스트림에 넣어지는 것이기 때문에 예외가 던져지는 것이 아니다. 결국 반복문을 종료시키려면 hasNextInt()에서 EOF를 입력(윈도우의 경우는 ctrl + Z, 리눅스계열의 경우 ctrl + D)해주거나 정수가 아닌 문자열을 입력한다던가 등 다른 타입의 입력을 주어 InputMismatchException 을 던져주어야 한다.





    위에 보면 2번째 빈 칸은 공백(space)를, 4번째엔 Enter 를 쳤지만 예외가 발생하지 않는 걸 볼 수 있다.

    예외를 발생시켜 프로그램을 종료시키기 위해 정수가 아닌 값을 입력함으로써 예외를 발생시켜야 종료될 수 있음을 보여줬다.

    ----------------------------------------------------------------------------------------------------------------------

    • BufferedReader


    BufferedReader 의 경우 null 을 반환한다. 이 부분은 오히려 null 인지 아닌지만 조건문을 통해 구분해주면 되므로 쉽다.

    참고로 BufferedReader로 null을 반환하기 위해서는 역시 EOF를 던져주어야 하기 때문에 ctrl + Z (윈도우)혹은 ctrl + D(리눅스)를 입력해야한다.

    ----------------------------------------------------------------------------------------------------------------------

    출처:https://st-lab.tistory.com/40

     

    [백준] 10951번 : A+B - 4 - JAVA [자바]

    https://www.acmicpc.net/problem/10951 10951번: A+B - 4 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 간단한 문제지만 의외로 종료시점을 몰라 틀리는 경우들..

    st-lab.tistory.com

     

     

    728x90
    반응형