CS

파이썬에서 EOF 처리하기

술단고 2023. 10. 6. 22:50
잠깐, 이 코딩테스트 문제... 테스트케이스에 개수가 주어지지 않았잖아!

 

 

백준에서 코딩 테스트 문제를 풀다보면,

가끔 아래와 같은 입력 조건이 보일 때가 있다.

 

입력은 여러 개의 테스트 케이스로 이루어져 있다...?

 

테스트케이스에 개수가 주어지지 않은 문제.

즉, 사용자가 원하면 1개만 입력을 할 수도 있고, 10개, 100개... N개를 입력할 수 있는 것이다.

 

이런 단점을 해결하기 위해 대부분의 문제는 처음부터 사용자가 몇 개를 입력할지

그 자체를 입력하고 시작하는 경우도 있지만,

여전히 저렇게 미지의 개수를 입력해야하는 문제는 많이 있다.

 

이럴 때 사용해야 하는 것이 바로 EOF 처리이다.

 


 

EOF (End Of File) 이란?

세부적으로 알기 위해선 '파일'에 대해 알아야 하지만, 간단히만 이야기하자면

파일의 끝을 표시하기 위한 상수라고 생각해도 무관하다.

즉, "여기가 입력 끝입니다!" 라는 체크 표시같은 것이다.

 

함수 호출이 실패했을 때나, 윈도우에서 Ctrl + Z를 입력했을 때나, 리눅스에서 Ctrl + D를 입력했을 때도 이 EOF를 반환한다.

 

코딩 테스트 문제에서의 EOF

위에서 든 예시처럼, 테스트 케이스가 여러 개이고, 개수가 주어지지 않았을 때 EOF를 사용한다.

입력의 끝에 도달했다면(EOF가 입력됐다면), 입력을 종료하도록 하면 된다.

 

파이썬에서는 이 EOF를 다음과 같은 방식으로 처리할 수 있다.

 

1. try ~ except 사용

lines = list()

while True :
    try :
        lines.append(input())
    except EOFError :
        break

try 내의 명령어를 실행하다가 오류가 나면 except 내의 명령어를 실행하는 파이썬의 명령어이다.

 

input() 명령어는, EOF가 감지되면 EOFError를 반환한다.

 

while True : 를 사용해 무한히 사용자로부터 입력을 받다가,

EOF가 감지되는 순간 EOFError가 발생하여 해당 while문을 탈출하는 방식이다.

만약 최대로 받을 수 있는 개수가 따로 존재한다면, 조건문을 True 대신 다른 유한한 조건으로 바꾸어도 좋다.

 

2. sys.stdin 사용

import sys

lines = list()

for line in sys.stdin :
    lines.append(line)

이 방식이 내가 주로 EOF를 처리할 때 사용하는 방식이다.

sys.stdin은 주로 readline()과 함께 쓰이며, 파이썬의 일반적인 input()보다 입력이 더 빨라 시간복잡도가 매우 중요한 코딩 테스트 문제풀이에서 입력에 쓰이는 시간을 줄일 때 자주 쓰인다.

 

sys.stdin 명령어는 EOF가 감지되면 빈 문자열을 반환한다.

 

for문을 통해 입력이 존재하는 한 계속해서 입력을 받다가,

빈 문자열이 반환되면 for문이 종료되는 방식이다.

그냥 input()을 사용하는 것보다 코드의 가독성도 좋고, 입력 속도도 비교적 빠르다.

 


 

이런 EOF처리를 활용해야 하는 문제들은 생각보다 많으며,

코딩 테스트 뿐만 아니라 실제 프로그램을 개발할 때도 파일에 대해 이해하고 있다면 자주 사용하게 될 녀석이다.

 

EOF를 활용하는 문제는 다음과 같은 것들이 있다.

 

10951번: A+B - 4

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

www.acmicpc.net

 

 

9733번: 꿀벌

각각의 일을 한 횟수와 비율을 공백으로 구분하여 출력한다. 출력은 {Re,Pt,Cc,Ea,Tb,Cm,Ex} 순서대로 하며, 비율은 소수점 둘째 자리까지 출력한다. 주어진 목록에 없는 일은 출력하지 않는다. 입력의

www.acmicpc.net

'CS' 카테고리의 다른 글

[디자인 패턴] 싱글톤 패턴(Singleton Pattern)에 대하여  (0) 2023.04.01