Notice
Recent Posts
Recent Comments
Link
코테 탈출일지
[백준] 10866번: 덱 - 파이썬/python 본문
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을 받게 됩니다.
'구현' 카테고리의 다른 글
[백준] 1158번: 요세푸스 문제 - 파이썬/python (0) | 2023.07.04 |
---|---|
[백준] 10828번: 스택 - 파이썬/python (0) | 2023.07.04 |
[백준] 2941번: 크로아티아 알파벳 - 파이썬/python (0) | 2023.06.30 |
[백준] 4673번: 셀프 넘버 - 파이썬/python (0) | 2023.06.27 |
[백준] 1316번: 그룹 단어 체커 - 파이썬/python (0) | 2023.06.26 |