[백준 11718번] 그대로 출력하기

김민선·2025년 3월 6일
2

백준을 풀어보다가 새로 알게된 내용들이 있어 작성해보려한다. 문제 내용은 다음과 같다.

그냥 여러 줄을 입력받고 그대로 출력하는 아~~주 간단해보이는 문제이다. 그런데... 오랜만에 파이썬을 하는 나는 어떻게 풀지 감이 잡히지 않았다!!!

그래서 검색을 해보았다. 구글에 치니까 맨 위에 이 분의 블로그가 올라왔다.
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)

이 블로그 말고도 다른 블로그도 찾아보다가 readlinereadlines의 차이점에 대해서도 알게 되었다.

readline()
한 번에 한 줄씩 읽는다.
호출할 때마다 파일에서 다음 줄을 반환한다.
줄 끝의 개행문자를 포함한다.
파일의 끝에 도달하면 빈 문자열을 반환한다.

readlines()
모든 줄을 한 번에 읽어 리스트로 반환한다.
각 줄은 리스트의 요소로 저장되며, 개행 문자를 포함한다.
대용량 파일을 처리할 때 메모리 사용량이 많을 수 있다.

readline()은 한 줄씩 처리하므로 메모리 효율적, readlines()는 모든 내용을 메모리에 로드한다.

readline()은 반복문에서 사용하기 적합, readlines()는 모든 데이터를 한 번에 처리할 때 유용하다.

대량의 데이터에서 readline()이 더 효율적일 수 있다.

알고리즘 문제 해결 시 주로 readline()을 사용하는 것이 메모리와 속도 면에서 효율적이다.

결론

sys.stdin.realine()EOF일 때 빈 문자열이 반환된다.

profile
코린이입니다.

0개의 댓글