Skip to content

문제 9 · 큐 2개로 스택 구현

문제 9 [4점]

2개의 큐를 사용하여 1개의 스택을 구현하는 방법을 서술(2점)하고, 삽입(push)과 제거(remove) 연산의 성능을 서술(각 1점)하시오.

풀이 및 해설

큐는 선입선출(FIFO), 스택은 **후입선출(LIFO)**이므로, 두 개의 큐 q1, q2를 두고 순서를 뒤집는 작업으로 LIFO를 흉내 냅니다. 여기서는 삽입을 싸게(값싼 push) 하는 방식을 설명합니다.

구현 방법(2점).

  • push(x): 그냥 q1enqueue 합니다. (원소를 계속 q1 뒤에 쌓아 둠)
  • remove()(pop): 스택의 top은 q1에서 가장 마지막에 들어간 원소입니다. q1에 원소가 하나 남을 때까지 앞에서 하나씩 꺼내(dequeue) q2로 옮깁니다. 그러면 q1에 마지막 하나만 남고, 이것이 곧 top이므로 꺼내서 반환합니다. 그 뒤 q1q2의 역할을 맞바꿉니다(다음 연산을 위해 원소들이 q1에 모여 있도록).
push:  q1 <- x
pop :  q1 의 마지막 1개만 남기고 나머지를 q2 로 이동
       남은 1개(=top) 반환,  q1 <-> q2 교환

성능(각 1점).

  • push: 큐에 한 번 넣는 것이 전부이므로 O(1).
  • remove(pop): 원소 N1개를 옮겨야 하므로 O(N).
push=O(1),pop=O(N)

반대로 push를 비싸게(넣을 때마다 뒤집기), pop을 싸게 하는 방식도 있는데, 그 경우 pushO(N), removeO(1)이 됩니다. 어느 쪽이든 두 연산 중 하나는 O(N)을 피할 수 없습니다.

👉 실습(C++)에서 확인하기

PDF