570 words
3 minutes
파이썬에서 EOF 처리
EOF(End Of File)은 컴퓨터에게 “여기가 입력의 마지막이다”라고 알려주는 신호다.
알고리즘 문제에서 입력 개수가 정해지지 않은 경우, EOF 처리를 해주는 코드를 짜야 코드 실행이 종료될 수 있다. 패턴 몇 가지만 기억하면 된다.
EOF 입력하는 방법리눅스/맥 터미널 : ctrl + D윈도우 콘솔 : ctrl + Z + Enter입력을 한 줄씩 처리하는 패턴
sys.stdin.readline()을 사용하면 입력을 한줄씩 읽어오게 되는데,
EOF를 입력 받으면 ""(빈 문자열)을 반환하게 된다.
이를 이용해서 EOF를 입력 시에 종료되는 반복문을 짜면 된다.
import sys# 내장 함수 덮어쓰기input = sys.stdin.readline
while True: line = input() if line == "": # EOF 만나면 반복문 탈출 break ...EOF를 만나면 무한 루프를 탈출하는 형태다.
무한 루프가 불편하면 아래 코드를 쓰자.
import sys
for line in sys.stdin: # 입력을 한줄씩 가져오다가 # line에 EOF가 오면 자동으로 종료 ...내부적인 동작이 readline()과 동일하다고 보면 된다.
입력을 한번에 받아오는 패턴
read()로 입력을 한번에 받아서 처리할 수도 있다.
import sys
data = sys.stdin.read()for line in data.splitlines(): # 개행 문자 x ...
# 개행 문자가 필요한 경우for line in data.splitlines(True): ...line 구분 없이, 입력을 split하는게 목적이면 아래 패턴이 빠르다.
import sys
# EOF까지 읽어서 공백 기준으로 split한걸 반복자(iter)로 만든다it = iter(sys.stdin.read().split())
for tok in it: # tok를 int형으로 쓰고 싶으면 int(tok) 쓰면 됨 ...# 최적화를 위해 buffer를 쓰는 버전it = iter(sys.stdin.buffer.read().split())
for tok in it: # buffer를 쓰면 결과물이 bytes 토큰으로 바뀌기 때문에 # 문자열로 쓰려면 decode()를 써서 str으로 바꿔야 한다 s = tok.decode() # decode() 안해도 int(tok)는 가능N과 N개의 값이 주어지는 경우, 아래와 같이 처리할 수도 있다.
# 입력 형태# 4# 20 30 40 50
import sys
N, *arr = map(int, sys.stdin.buffer.read().split())
for num in arr: # 이미 int라 추가적인 형 변환 필요 x ...