[백준] 1874번 스택 수열 _ python

메링·2022년 8월 2일
0

알고리즘 문제

목록 보기
15/22

그냥 생각나는대로 입력받으면 일단 list에 넣고 정렬해서 풀었더니 시간초과.
시간 초과 난 첫 시도는 다음과 같다.

1차 시도(시간 초과)

n = int(input())
input_lst = []
for i in range(n):
    input_lst.append(int(input()))

sorted_lst = sorted(input_lst, reverse=True)
stack = []
check = []

def stack_nums():
    re_val = True
    for num in input_lst:
        while num not in stack:
            stack.append(sorted_lst.pop())
            check.append('+')

        now = stack.pop()
        if now == num:
            check.append('-')
        else:
            re_val = False
            return re_val
    return re_val

result = stack_nums()
if result:
    for n in check:
        print(n)
else:
    print('NO')

어차피 중간에 비는 값 없이 n개가 전부 나오니까 그냥 하나 입력받고 바로바로 처리해 주면 훨씬 시간이 단축된다. 나는 중간에 비는 값이 있을 수 있는 줄 알고, 끝까지 입력받고 이걸 정렬해서 풀었다. 문제 파악도 중요한 것 같다.

2차 시도(성공)

n = int(input())
stack = []
check = []
last = 1
state = True
for i in range(n):
    now_in = int(input())
    for num in range(last, now_in+1):
        stack.append(num)
        check.append('+')
        last += 1

    if now_in == stack[-1]:
        stack.pop()
        check.append('-')
    else:
        state = False

if state:
    for j in check:
        print(j)
else:
    print('NO')

딱히 예외 처리해줄 것도 없고 까다로운 문제는 아니었는데 생각보다 너무 오래걸렸다.... 연습 많이 해야겠다.

3차 시도(성공)

다음 날 다시 풀어볼 때, input() 안 쓰고 readline() 사용
더 빠르다는 건 알고 있었으나, 귀찮아서,, 안 썼는데 무조건 써야겠다. 시간 차 많이 남.
while문이 더 편할 것 같아서 while 문 사용하고, 실패했을 때 break 걸어 줌.

import sys

n = int(sys.stdin.readline())
stack = []
check = []
last_num = 1
result = True

for i in range(n):
    num = int(sys.stdin.readline())
    while last_num <= num:
        stack.append(last_num)
        check.append('+')
        last_num += 1
    if stack[-1] == num:
        stack.pop()
        check.append('-')
    else:
        result = False
        break

if result:
    for j in check:
        print(j)
else:
    print('NO')
profile
https://github.com/HeaRinKim

0개의 댓글