[ 백준 문제 10951 / 파이썬 ] A+B - 4 : EOF 관련 문제

2023. 2. 7. 13:01백준/파이썬

 

10951번: A+B - 4

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

www.acmicpc.net

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

 

문제 보고 무한으로 입력받는 반복문 문제인가? 싶었습니다.

 

import sys

input = sys.stdin.readline

while True:
    A, B = map(int, input().split())
    print(A+B)

 

이렇게 써줬고 무한루프로 입력을 받아줬어요.

 

답을 제출하니, 런 타임 에러가 났습니다.

 

입력 조건에서 어디까지가 입력의 끝인지 명확하게 제시되지 않았습니다.(mastershim님)

그 점에서 예외처리가 필요한 문제라는 것을 알 수 있습니다.

 


우리가 어떤 상황에서 실패할 수 있는 코드를 실행할 때,

일어날 수 있는 모든 에러를 방지하기 위해 적절한 예외 처리가 필요합니다.

 

코드 중 어디에서 예외가 발생할 것인지를 예측하고,

이를 예측 처리하는 것은 좋은 습관입니다.

 

예외 처리로 문제를 해결하지 못할 수도 있으나,

적어도 사용자에게 이 상황을 알리고 프로그램을 종료할 수 있게 됩니다.

 

어떤 함수에서 예외가 발생하여 그곳에서 예외임이 잡히지 않았다면

이 함수를 호출한 핸들러에 의해 그 예외를 잡을 때까지 버블링 합니다.

 

예외 처리를 하지 않는다면, 파이썬은

에러 메시지와 오류가 발생한 위치에 대한 정보를 출력하고,

프로그램을 종료합니다.

우리가 자주 보는 이런 에러를 낸다는 소리입니다.

 


에러가 발생하도록 코드를 방치하는 것보다는

그 에러를 처리해주는 게 당연히 좋겠죠?

 

에러가 예상되는 코드에 try문을 사용하고,

그 에러를 처리하기 위해 except 문을 사용해줍니다.

 

try:
except:

try에는 실행할 코드를 넣고,

except에는 예외가 발생했을 때 처리하는 코드를 넣습니다.

 

try문을 실행하다가 예외가 발생한다면 except 문을 실행시킵니다.

 

try문의 코드가 에러 없이 잘 실행 된다면

except문 속 코드는 실행되지 않습니다.

 

  • EOF가 뭘까요?

EOF(End Of File). 직역하자면 '파일의 끝'으로 해석할 수 있습니다.

 input()은 파일의 끝이면 EOF에러를 발생시키나,

sys.stdin.readlines()은 파일의 끝까지 가져올 수 있습니다.
파일의 끝에 도달했을 때도 EOF에러가 발생하지 않고 그냥 빈 문자열을 리턴하게 됩니다.

 

▼ input()과 sys.stdin.readlines()의 차이점 참고하세요.

 

  • input() 사용 시 예외처리 하기
while True:
   try:
      A, B = map(int, input().split())
      print(A+B)
   except EOFError:
      break

=> 정답입니다.

 

  • sys.stdin.readlines() 사용 시 예외처리 하기
import sys

while True:
   try:
      A, B = map(int, sys.stdin.readline().split())
      print(A+B)
   except EOFError:
      break

=> 런타임 에러가 나는 경우입니다.

 

ai4youej 님


sys.stdin.readline은 EOF에 도달했을때도 그냥 빈 문자열을 반환합니다.

즉, sys.stdin.readline() 을 통해서 개행 문자열을 얻게 되고, 이를 split() 을 하려고 하기 때문입니다.

sys.stdin.readline()을 사용할 경우,
파일의 끝에 도달했을 때도 [ ]를 리턴하는데, split 통해 A, B 두 변수 값을 입력받아야하는데,
빈 문자열이므로 =>  Value Error가 발생합니다.

 

즉! 파일의 끝, 즉 EOF에 와도 sys.stdin.readline()을 사용하면

EOF Error가 발생하지 않고 Value Error가 발생한다는 것입니다.

 

import sys

while True:
   try:
      A, B = map(int, sys.stdin.readline().split())
      print(A+B)
   except ValueError:
      break

=> 정답입니다.

 

그러니 이렇게 예외처리를 하면 됩니다!