백준 11718

jeonghens·2023년 11월 20일

알고리즘: BOJ

목록 보기
23/125

https://www.acmicpc.net/problem/11718

틀렸다.
브론즈라고 무시하지 말고, 겸손하자.
(실제 정답률도 40% 밑..)

문제를 읽고,
사용자 입력으로 '\n'가 들어온 경우만 출력을 종료하면 된다고 생각했다.

내가 제출한 풀이는 다음과 같다.

import sys

while (True):
    user_input = sys.stdin.readline()

    if user_input == '\n':
        break
    else:
        print(user_input, end='')

시간 초과가 떴다.

아래 정답 코드와 비교했을 때,
시간 초과가 날 만한 부분이 없다고 생각했고, 고민하고도 이유를 찾지 못했다.

(chatGPT의 답변은 다음과 같았다.

sys.stdin.readline()은 개행 문자를 포함하여 사용자 입력을 읽어오기 때문에,
사용자가 입력을 중단하고 엔터(개행)를 입력할 때까지 계속해서 while 루프가 실행되고 있습니다.
이렇게 되면 사용자가 입력을 완료하고 프로그램에게 입력의 끝을 알리기 전까지 루프가 끝나지 않습니다.) ?

[ 정답 코드 1 ]

import sys

while (True):
    user_input = sys.stdin.readline().rstrip()

    if user_input == '':
        break
    else:
        print(user_input)

rtsrip()은 공백(space), 탭(tab), 개행(newline) 등의 공백 문자를 제거하므로,
만약 사용자 입력이 공백이라면 user_input은 빈 문자열이므로 break가 실행될 것이고,
그렇지 않다면 사용자 입력이 정상 출력된다.

[ 정답 코드 2 ]

while True:
    try:
        print(input())
    except EOFError:
        break

try-except를 활용한 풀이이다.

문제의 조건을 보면 정상 입력만 주어진다.
즉, 사용자 입력을 검사할 필요가 없이 받은 그대로 출력하면 되므로,
입력이 아닐 때는 그냥 except로 break를 실행시키면 되는 것이다.

여기서, try:에서 input()이 아니라 sys.stdin.readline().rstrip()을 쓰면 에러가 뜨는데,
이는 input()은 입력 값이 없으면 EOFError를 발생시키지만, sys.stdin.readline()은 빈 문자열을 반환하기 때문에 시간 초과(에러)가 뜨는 것이라고 한다. (https://hgk5722.tistory.com/221)

profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글