코테 탈출일지

[백준] 10866번: 덱 - 파이썬/python 본문

구현

[백준] 10866번: 덱 - 파이썬/python

히려이 2023. 6. 30. 15:49

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

 

10866번: 덱

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

접근 방식

- 효율적인 조건문 작성법 고민

- 데크의 기본 함수 확인

 

코드 풀이

from collections import deque
import sys
deq = deque()
n = int(input())

for _ in range(n):
#     order = list(map(str, input().split(' '))) 대신 아래의 방법 사용
    order = sys.stdin.readline().split()
    
    if order[0] == 'push_front':
        deq.appendleft(int(order[1]))
        
    elif order[0] == 'push_back':
        deq.append(int(order[1]))
        
    elif order[0] == 'pop_front':
        if deq:
            n = deq.popleft()
            print(n)
        else: print(-1)
                
    elif order[0] == 'pop_back':
        if deq:
            n = deq.pop()
            print(n)
        else: print(-1)
        
    elif order[0] == 'size':
        print(len(deq))
            
    elif order[0] == 'empty':
        if deq: print(0)
        else: print(1)
                
    elif order[0] == 'front':
        if deq: print(deq[0])
        else: print(-1)
                
    elif order[0] == 'back':
        if deq: print(deq[-1])
        else: print(-1)

처음에는 정말 명령어 바탕으로 일일이 조건문을 만드는게 맞나 고민했습니다. 하지만 실제 데크에서 활용할 수 있는 명령어 (pop, popleft, append, appendleft)와 input으로 받는 문자 형식의 명령어가 다르므로 어쩔 수 없는 방식이라고 생각합니다. 대신 문제의 방점을 비교적 복잡도가 낮은 코드 짜기와 데크의 활용 함수 알기로 잡았습니다.

 

오답 이유

아래의 방식처럼 처음 코드를 작성하였고, 시간초과가 발생했습니다.

from collections import deque
deq = deque()
n = int(input())

for _ in range(n):
    order = str(input())
    if order[:4] == 'push':
        how, what = order.split(' ')
        if how == 'push_front': deq.appendleft(int(what))
        else: deq.append(int(what))
    else:
        if order == 'pop_front':
            if deq:
                n = deq.popleft()
                print(n)
            else: print(-1)
                
        if order == 'pop_back':
            if deq:
                n = deq.pop()
                print(n)
            else: print(-1)
        
        if order == 'size':
            print(len(deq))
            
        if order == 'empty':
            if deq: print(0)
            else: print(1)
                
        if order == 'front':
            if deq:
                print(deq[0])
            else: print(-1)
                
        if order == 'back':
            if deq:
                print(deq[-1])
            else: print(-1)

시간 초과의 원인은 input을 받는 방식입니다. input()은 매개변수로 prompt message를 받을 수 있으며 입력받은 문자의 개행 문자(줄바꿈 문자, ex \n) 를 삭제시키고 반환하므로 상대적으로 느립니다. 또한 for 안의 삼중 if문 또한 복잡도를 증가시키는 요인이므로 이중으로 변경, if의 병렬보다는 elif의 활용을 통해 간결화했습니다.

 

메모

order = sys.stdin.readline().split()은 공백을 기준으로 문자열 분리되어 리스트로 input을 받게 됩니다.