백준 4949 파이썬 sys.stdin.readline 출력초과 해결방법과 이유

이라운·2022년 8월 23일
0
post-thumbnail

백준 4949

문제를 풀면서 그냥 input() 으로 풀때는 괜찮았는데, readline 을 쓰니까 출력초과가 떴다.
머리를 싸매다가 readline 은 개행문자를 포함해서 받는다는 것과 놓쳤던 조건을 발견하고 아래와 같은 반례를 생각해낼 수 있었다.

💡원인

조건을 보면 아래 밑줄친 부분처럼 개행문자로 끝나는 것이 아닌, '.'이 있어야 한 줄이 끝난다.

그런데 readline은 개행문자를 포함해서 받아오기 때문에 한 줄씩 받아와서 처리를 하니 줄 마다 결과가 나왔던 것이고,
input 을 쓰면 자동으로 개행문자를 지워서 받아오니 문제가 되지 않았던 것이다.

✅ 반례

[반례]
[)]

 .
.
[readline 출력 결과]
no
yes
yes
yes
[정답]
no

💻 풀이코드

# 여기 주석풀고 제출하면 출력 초과가 나온다
# import sys
# input = sys.stdin.readline

def stackLoop(text):
    stack = []
    for char in text:
        if char == '(' or char == '[':
            stack.append(char)
        elif char == ')':
            if stack and stack[-1] == '(':
                stack.pop()
            else:
                return False
        elif char == ']':
            if stack and stack[-1] == '[':
                stack.pop()
            else:
                return False
    if not stack:
        return True
    else:
        return False

while True:
    # 입력을 받고
    text = input()
    # 만약 입력이 비어있다면 loop 를 끝낸다
    if text == '.': 
        break
    if stackLoop(list(text)):
        print('yes')
    else:
        print('no')
profile
Programmer + Poet = Proet

0개의 댓글