Skip to content

문제 9 · 배열 하나로 스택 2개

문제 9 [4점]

크기가 N으로 고정되어 있는 배열 하나를 이용하여 두 개의 스택을 구현하는 방법을 서술(2점)하시오. 이 때, 두 스택의 원소 총합은 N개를 넘지 않는다고 가정하고, 삽입(push)과 제거(remove) 연산의 성능이 O(1)을 넘지 않도록 하는 방법을 서술(2점)하시오.

풀이 및 해설

구현 방법(2점). 두 스택이 배열의 양쪽 끝에서 서로 마주 보며 가운데로 자라나도록 배치합니다.

  • 스택 1왼쪽 끝에서 시작합니다. top11로 두고, 커질 때 0,1,2, 방향(오른쪽)으로 증가시킵니다.
  • 스택 2오른쪽 끝에서 시작합니다. top2N으로 두고, 커질 때 N1,N2, 방향(왼쪽)으로 감소시킵니다.
 index:  0   1   2   ...        N-2  N-1
        [S1 →→→ ]  (빈 공간)  [ ←←← S2]
        top1 이 오른쪽으로       top2 가 왼쪽으로

두 스택은 가운데의 빈 공간을 공유하므로, 어느 한쪽이 크더라도 총합이 N을 넘지 않는 한 낭비 없이 배열을 나눠 씁니다.

O(1) 연산(2점). 각 연산은 인덱스 하나만 바꾸면 됩니다.

  • push1(x): 가득 찼는지(top1 + 1 == top2) 확인 후, arr[++top1] = x.
  • push2(x): 가득 찼는지 확인 후, arr[--top2] = x.
  • pop1(): arr[top1--] 반환. pop2(): arr[top2++] 반환.

포화 판정은 두 top이 만나는지(top1 + 1 == top2)로 하며, 원소 이동이 전혀 없습니다.

양 끝에서 마주 보게 배치; push/pop 모두 인덱스 갱신뿐이라 O(1)

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

PDF