파이썬 알고리즘 기본기 EOF(End of File) 배우기
1. 문제
2. 풀이
주어진 입력의 끝을 모를때, 어떻게 입력의 끝을 알고 문제를 풀 수 있을까?
input파일을 프로그램이 읽어들이는데, 더 이상 읽을게 없을때 올바르게 프로그램을 종료할줄 알아야한다.
파이썬에서 한줄씩 입력을 받는 방법은 대표적으로 2가지가 있겠다
첫번째는 input()이고 두번째는 sys.stdin.readline()
input()은 한줄을 읽을때, 개행문자를 제거하고 한줄을 읽어서 문자열로 return하며
input()은 파일의 끝에 도달하면, EOFError를 발생시킨다.
따라서 무한 반복 while문을 try로 돌다가 파일의 끝을 읽을때 자연스럽게 EOFError를 발생시키므로 except로 반복문을 탈출하면 된다
while 1:
try:
s = input()
answer = [0,0,0,0]
for c in s:
if c.islower():
answer[0] += 1
elif c.isupper():
answer[1] += 1
elif c.isdigit():
answer[2] += 1
elif c == ' ':
answer[3] += 1
print(*answer)
except:
break
실제로 ctrl+d로 강제로 EOF 일으키면 EOFError가 일어남
그런데 input()은 속도가 느릴 수 있어서 반드시 sys.stdin.readline()을 쓰고싶다면...?
sys.stdin.readline()은 한 줄을 읽을때, 개행문자 \n을 같이 읽어오므로,
문자열 그 자체로 사용할때는 반드시 rstrip()으로 개행문자를 제거하는게 중요하다
또한 EOF에 도달하면 input()과는 다르게 에러를 발생시키지 않고 빈 문자열을 반환한다
from sys import stdin
while 1:
s = stdin.readline()
if s == '':
break
else:
answer = [0,0,0,0]
for c in s:
if c.islower():
answer[0] += 1
elif c.isupper():
answer[1] += 1
elif c.isdigit():
answer[2] += 1
elif c == ' ':
answer[3] += 1
print(*answer)
실제로 EOF를 읽어보면.. 빈 문자열이 나온다
그리고 개행문자를 읽어들이는 sys.stdin.readline()과 그렇지 않는 input()의 차이
브론즈는 쉽다고 생각해서 안풀었더니.. 기본기가 생각보다 많이 부족하네..??
참조
[TIL] #5. sys.stdin.readline() (tistory.com)
[BOJ] 입출력에서 readline()과 input()의 EOF 입력시 차이점 (tistory.com)
'알고리즘 > 알고리즘 일반' 카테고리의 다른 글
알고리즘 테크닉 - LR 테크닉 (0) | 2023.04.16 |
---|---|
자바 알고리즘 기본 -입력을 받는 방법- (0) | 2023.02.15 |
알고리즘 문제를 풀기위해 2차원 배열에서 이해해야할 테크닉들 (0) | 2022.09.11 |
중위표기법을 후위표기법으로 바꾸고 이를 계산하는 알고리즘 2편 (0) | 2022.08.22 |
사칙연산 중위표기법을 후위표기법으로 바꾸는 알고리즘 1편 (0) | 2022.08.22 |