일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ObservedObject
- ObservableObject
- 네이버 부스트캠프
- 운영체제
- StateObject
- Swift 문법
- global soop
- OS
- 제앱소
- 애플 디벨로퍼 아카데미
- iOS 개발 오류
- 소프트웨어분석및설계
- SWIFT
- 치지직
- 숭실대
- sqoop
- apple developer academy 후기
- useReducer
- 데이터베이스
- 네이버 치지직
- 애플 디벨로퍼 아카데미 21주차 회고
- 데이터베이스 공부
- 애플 아카데미 후기
- 애플 디벨로퍼 아카데미 후기
- 앱 비교 프로젝트
- Swift 기능
- Apple Developer Academy @ POSTECH
- Swift 디자인패턴
- swift문법
- react
- Today
- Total
사과하는 제라스
[백준 BOJ 10951번] A+B-4 본문
목차
출처 : https://www.acmicpc.net/problem/10951
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 문으로 예외발생시 반복문을 종료해주도록 처리함.
- 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
'JAVA 백준 알고리즘 문제풀이 > 반복문' 카테고리의 다른 글
[백준 BOJ 1110번] 더하기 사이클 (0) | 2022.03.28 |
---|---|
[백준 BOJ 10871번] X보다 작은 수 (0) | 2022.03.28 |
[백준 BOJ 2439번] 별 찍기-2 (0) | 2022.03.28 |
[백준 BOJ 2438번] 별 찍기-1 (0) | 2022.03.28 |
[백준 BOJ 11022번] A+B-8 (0) | 2022.03.28 |