백준을 풀어보다가 새로 알게된 내용들이 있어 작성해보려한다. 문제 내용은 다음과 같다.
그냥 여러 줄을 입력받고 그대로 출력하는 아~~주 간단해보이는 문제이다. 그런데... 오랜만에 파이썬을 하는 나는 어떻게 풀지 감이 잡히지 않았다!!!
그래서 검색을 해보았다. 구글에 치니까 맨 위에 이 분의 블로그가 올라왔다.
https://juni-tech.tistory.com/10
이 분은 EOF(End Of File)
에러를 사용하여 문제를 풀이하셨다. 현재 나도 백준에서의 파이썬 속도를 줄이기 위해 다음 코드를 사용하고 있었다.
import sys
input = sys.stdin.readline().rstrip
그래서 이 문제도 저 방법을 사용하면 풀 수 있겠지 생각했었는데... 저 분의 블로그를 보니까 안된다는 것을 알게되었다!
import sys
while True:
try:
print(sys.stdin.readline().rstrip())
except EOFError:
break
저 코드를 제출하게 되면 출력초과 에러가 뜬다.
그냥 input()으로 변경하면 정답으로 뜬다.
while True:
try:
print(input())
except EOFError:
break
이유는 input()
과 sys.stdin.readline()
의 차이점 때문이다.
https://www.acmicpc.net/board/view/57241
input()
은 EOF
를 받을 때, EOFError
를 일으키지만, sys.stdin.readline
은 빈 문자열을 리턴한다. 그러니 출력 초과가 나오는 것이다!!! 에러가 나지 않고 빈 문자열이 리턴되기 때문이다.
그래도 만약에 sys.stdin.realine
을 사용하고 싶다면 빈 문자열이 리턴되는 것을 이용하여 조건문으로 확인하고 else로 출력하면 된다.
import sys
while True:
s = sys.stdin.readline().rstrip()
if s == '':
break
else:
print(s)
이 블로그 말고도 다른 블로그도 찾아보다가 readline
과 readlines
의 차이점에 대해서도 알게 되었다.
readline()
한 번에 한 줄씩 읽는다.
호출할 때마다 파일에서 다음 줄을 반환한다.
줄 끝의 개행문자를 포함한다.
파일의 끝에 도달하면 빈 문자열을 반환한다.
readlines()
모든 줄을 한 번에 읽어 리스트로 반환한다.
각 줄은 리스트의 요소로 저장되며, 개행 문자를 포함한다.
대용량 파일을 처리할 때 메모리 사용량이 많을 수 있다.
readline()
은 한 줄씩 처리하므로 메모리 효율적, readlines()
는 모든 내용을 메모리에 로드한다.
readline()
은 반복문에서 사용하기 적합, readlines()
는 모든 데이터를 한 번에 처리할 때 유용하다.
대량의 데이터에서 readline()
이 더 효율적일 수 있다.
알고리즘 문제 해결 시 주로 readline()
을 사용하는 것이 메모리와 속도 면에서 효율적이다.
sys.stdin.realine()
은 EOF
일 때 빈 문자열이 반환된다.