[백준/실버3] 24511번 queuestack | 파이썬 Python

문제

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

 

 

 

입력

 

출력

 

예제

 

나의 풀이1 (실패)

from collections import deque

N = int(input())
A = list(map(int, input().split()))
B = deque(map(int, input().split()))
M = int(input())
C = list(map(int, input().split()))

for num in C:
    x = num

    for i in range(N):
        if A[i] == 0: # queue
            temp = B[i]
            B[i] = x
            x = temp
            
    print(x, end=" ")
  • 자료구조가 큐인 경우에만 큐의 요소를 수정하는 방법으로 풀었는데 시간 초과로 실패했다. (사실 이렇게 풀 거면 굳이 큐를 적용할 이유가 없긴 하다...)

 

다른 사람의 풀이

from collections import deque

N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
M = int(input())
C = list(map(int, input().split()))

queue = deque([])

for i in range(N):
    if A[i] == 0:
        queue.append(B[i])

for i in range(M):
    queue.appendleft(C[i])
    print(queue.pop(), end=" ")
  • 큐의 요소에 아무런 영향을 미치지 못하는 스택을 제외하고 아예 큐의 자료구조를 가지는 원소들만 걸러낸다.

  • 큐 자료구조로만 구성된 수열을 계산해보면 첫 번째 요소가 새로운 원소로 교체되고, 나머지 요소들은 뒤로 한 칸씩 밀리면서 맨 마지막 요소를 출력하게 된다는 걸 알 수 있다.
  • 이 규칙을 활용해서 큐의 앞에서는 `C`의 원소를 하나씩 추가하고, 뒤에서는 하나씩 빼고, `pop()`한 값을 출력한다.

 

참고

  • 반복되는 규칙을 찾아내긴 했지만 이걸 실제 구현으로 연결하지 못한 것이 아쉽다.