관리 메뉴

사과하는 제라스

[백준 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
반응형