문제 확인
나의 풀이
- 기존 컨베이어 벨트와 보조 컨베이어 벨트를 각각
Queue
와Stack
으로 만든 뒤, 주어진 조건에 만족하도록 구현했다.
# 1 ~ n 까지의 택배를 재 배열
# 기존 컨베이어 : queue -> 작은 수부터 빼낼 수 있음
# 보조 컨베이어 : Stack -> 큰 수부터 빼낼 수 있음
# 몇 개의 상자를 실을 수 있는지
# order의 상자가 나올 때 까지 pop
from collections import deque
def solution(order):
order = deque(order)
# 메인 컨베이어 작업 목록
main_line = deque(range(order[0] ,len(order) + 1))
# 서브 컨베이어 작업 목록
sub_line = list(range(1, order[0]))
# 개수 확인
cnt = 0
# 꺼낼 main이 있는지 확인
flag = True
while flag and order:
order_now = order.popleft()
while True:
# 메인에 있는 경우
if main_line and main_line[0] == order_now:
main_line.popleft()
cnt += 1
break
# 서브에 있는 경우
if sub_line and sub_line[-1] == order_now:
sub_line.pop()
cnt += 1
break
# 둘 다에 없는 경우
if not main_line:
flag = False
break
else:
sub_line.append(main_line.popleft())
return cnt
다른 사람의 풀이
- 보조 컨베이어 벨트 Stack에 제품을 옮기고, 제거할 성분이 생기면 while 반복문을 통해서 제거했다.
- Queue, Stack 문제가 보통 이렇게 접근하는 경우가 많으니, 담부턴 요런 방식으로 풀어보자!
def solution(order):
assist = []
i = 1
cnt = 0
while i != len(order)+1:
assist.append(i)
while assist and assist[-1] == order[cnt]:
cnt += 1
assist.pop()
i += 1
return cnt