https://www.acmicpc.net/problem/10951
브론즈 5에 해당하는 쉬운 문제이지만,
테스트의 종료 조건을 처리하지 못해서 틀린 사람들이 많은 것 같다.
문제를 살펴보자.
살펴볼 포인트는 두 가지이다.
- 공백을 기준으로 두 정수가 입력됨
- 더 이상 읽을 데이터가 없을 때 입력이 종료
여기서 주의할 점은 읽을 데이터가 없다는 것 !
읽을 수 있는 데이터가 없다는 건 EOF 를 의미한다.
EOF 는 End Of File. 데이터가 더 이상 존재하지 않는 파일의 끝을 의미한다.
일단 입력 방식을 여러 가지로 해서 풀어보자.
사실 방금 자바 입력 시간 줄이는 법을 알고 와서 기억하려고 일부러 하는 중 🫠
Java
- Scanner 를 이용해 입력받기
- BufferedReader 를 이용해 입력받기
Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(a+b);
}
}
}
가장 쉬운 방법이다.
hasNextInt()
를 통해 다음으로 입력이 들어올 정수가 있는지 확인하고
없으면 while 문이 종료되는 형태.
BufferedReader
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));
StringTokenizer st;
String str;
while ((str = br.readLine()) != null) {
st = new StringTokenizer(str, " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a+b);
}
}
}
BufferedReader
를 이용해서 입력을 받으면 Scanner
보다 입력 속도가 빠르다.
readLine()
으로 입력된 데이터가 없으면 while 문이 종료되는 형태.
StringTokenizer
를 이용해서 공백 기준으로 a와 b를 잘라서 받는다.
이 두 방법 이외에도 무한 루프에서 Scanner.nextInt()
를 이용해서 정수를 입력받다가,
더이상 받을 정수가 없어 NoSuchElementException
을 터트리는 방법도 있다.
백준 문제처럼 파일로 입력을 하는 경우 예외를 잡을 수 있지만,
실제 터미널에서 입력을 하는 경우에는 공백이나 엔터를 쳐도
InputStream
에 데이터가 들어가서 예외가 터지지 않는다.
이런 경우 ctrl + D 와 같이 EOF 를 입력해서
InputMismatchException
을 터트릴 수도 있다.
그냥 BufferedReader
로 null
체크하자 ..!
Python
- try-except 를 이용하기
import sys
def input():
return sys.stdin.readline().rstrip()
while True:
try:
a, b = map(int, input().split())
print(a+b)
except:
break
무한루프를 돌면서 두 정수를 입력받다가 더이상 입력이 들어오지 않거나
정수가 아닌 다른 입력이 들어오면 while 문이 종료되는 형태.
역시 파이썬이 훨씬 간결하다..
풀이코드 : https://github.com/jujuwon/algorithm/tree/main/baekjoon/BJ10951