Insights/For KR

백준 11718번: 입력이 없는데 EOFError가 발생하지 않는다고?

funczun 2024. 11. 23. 11:23
sys.stdin.readline()은 빈 문자열을 반환한다!
import sys

while True:
    try:
        userInput = sys.stdin.readline().strip()
        print(userInput)
    except:
        break

 EOFError(End of File)는 파일의 끝, 즉 입력의 끝을 의미한다. input()은 파일의 끝에서 EOFError를 발생시키지만, sys.stdin.readline()은 빈 문자열을 반환하므로 EOFError를 발생시키지 않는다. 따라서 출력 초과로 인한 오답 처리가 되는 것이다.

while True:
    try:
        print(input())
    except:
        break

 물론 이렇게 간단히 수정해도 좋지만, input() 대신 sys.stdin.readlines()를 사용할 수도 있다.

 

sys.stdin.readlines()를 사용하자!
import sys

userInput = sys.stdin.readlines()

for i in userInput:
    print(i.strip())

 input() 대신 sys.stdin.readlines()를 사용하면 시간을 더 단축시킬 수 있다. 단, sys.stdin.readline()sys.stdin.readlines() 모두 끝에 개행 문자(\n)를 포함하므로 꼭 strip()을 통해 개행 문자를 제거해 주어야 한다.

 sys.stdin.readline()sys.stdin.readlines()의 차이는 한 줄의 입력을 읽어오느냐, 모든 입력을 한번에 읽어와서 각 줄을 리스트의 원소로 저장하느냐의 차이다. sys.stdin.readlines()의 경우 사용자가 Enter를 입력하면 그 줄을 읽어 리스트에 추가할 뿐, 입력이 끝났다는 신호가 올 때까지 대기하므로 Ctrl + Z를 입력해 프로그램 입력을 끝내야 한다.