문제
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()`한 값을 출력한다.
참고
- 반복되는 규칙을 찾아내긴 했지만 이걸 실제 구현으로 연결하지 못한 것이 아쉽다.