두 개의 스택으로 큐(Queue) 구현하기: 실전 면접에서 마주한 낯선 자료구조 문제

2025. 6. 17. 17:16·자료구조
반응형

최근 실전 면접 라이브 코딩에서 "두 개의 스택으로 큐를 구현하라"는 문제를 처음 접했습니다. 평소에는 백준, 프로그래머스 등에서 알고리즘 문제만 풀어왔기에, 이렇게 직접 자료구조를 구현하는 문제는 예상치 못해 당황스러웠습니다. 이 글에서는 그때의 경험을 바탕으로, 문제의 개념과 구현 방법, 그리고 느낀 점을 정리합니다.


문제 소개: 알고리즘 문제만 풀다가 만난 직접 구현 과제

자료구조 면접에서 "스택(Stack)과 큐(Queue)의 차이"는 종종 등장하지만, 실제로 스택 두 개로 큐를 직접 구현하라는 문제는 저에게도 처음이었습니다. 단순히 개념을 아는 것과, 직접 코드를 짜는 것은 완전히 다르다는 점을 실감했습니다.

  • 스택(Stack): LIFO(Last-In-First-Out, 후입선출)
  • 큐(Queue): FIFO(First-In-First-Out, 선입선출)

비유: 스택은 접시를 쌓는 것, 큐는 줄 서서 차례를 기다리는 것과 비슷합니다.


핵심 아이디어: 스택 두 개로 큐의 동작을 흉내내기

큐는 먼저 들어온 데이터가 먼저 나가야(FIFO) 하지만, 스택은 반대입니다. 이 차이를 극복하기 위해 두 개의 스택을 사용합니다.

  • in_stack: 데이터를 넣는 용도 (enqueue)
  • out_stack: 데이터를 꺼내는 용도 (dequeue)

동작 원리

  1. enqueue(x): in_stack에 데이터를 push
  2. dequeue(): out_stack이 비어 있으면 in_stack의 모든 데이터를 pop해서 out_stack에 push (순서가 뒤집힘)
  3. out_stack에서 pop하여 반환 (FIFO가 됨)
연산 동작 설명
enqueue in_stack에 push
dequeue out_stack이 비어 있으면 in_stack → out_stack
out_stack에서 pop

파이썬 코드 예시: QueueUsingTwoStacks 클래스

class QueueUsingTwoStacks:
  def __init__(self):
    self.in_stack = []
    self.out_stack = []

  def enqueue(self, x):
    self.in_stack.append(x)

  def dequeue(self):
    if not self.out_stack:
      while self.in_stack:
        self.out_stack.append(self.in_stack.pop())
    if self.out_stack:
      return self.out_stack.pop()
    else:
      raise IndexError("dequeue from empty queue")

  def peek(self):
    if not self.out_stack:
      while self.in_stack:
        self.out_stack.append(self.in_stack.pop())
    if self.out_stack:
      return self.out_stack[-1]
    else:
      raise IndexError("peek from empty queue")

  def is_empty(self):
    return not self.in_stack and not self.out_stack

시간 복잡도 분석

  • enqueue: O(1)
  • dequeue: 평균적으로 O(1) (최악의 경우 O(n), 하지만 전체적으로 암ortized O(1))
  • peek: dequeue와 동일

실전 팁: dequeue 시 in_stack의 모든 원소를 옮기는 작업은 한 번에 몰아서 일어나므로, 전체적으로 보면 각 원소당 한 번씩만 이동합니다.


실생활 예시로 이해하기

  • in_stack: 새로 들어오는 손님이 줄을 서는 대기열
  • out_stack: 실제로 서비스를 받는 손님이 나가는 출구
  • 출구가 비어 있으면, 대기열의 손님을 한 번에 모두 출구로 이동시켜 차례대로 내보냅니다.

마무리: 왜 이 문제를 연습해야 할까?

  • 자료구조의 본질을 이해하고, 면접에서 자주 나오는 패턴을 익힐 수 있습니다.
  • 스택과 큐의 차이를 코드로 직접 구현하며 체감할 수 있습니다.
  • 암ortized 시간 복잡도 개념을 자연스럽게 익힐 수 있습니다.

결론 및 인사이트

두 개의 스택으로 큐를 구현하는 문제는 단순한 코딩 테스트를 넘어, 자료구조의 동작 원리와 효율성까지 묻는 좋은 문제입니다. 실제 면접에서 당황하지 않으려면, 직접 구현해보고 동작 원리를 설명할 수 있도록 연습해보세요.

반응형
저작자표시 비영리 변경금지 (새창열림)

'자료구조' 카테고리의 다른 글

연결 리스트(Linked List) 완전 정복: 메모리 효율적인 동적 자료구조의 모든 것  (2) 2025.06.20
Deque : 양방향 큐의 모든 것  (0) 2025.05.30
'자료구조' 카테고리의 다른 글
  • 연결 리스트(Linked List) 완전 정복: 메모리 효율적인 동적 자료구조의 모든 것
  • Deque : 양방향 큐의 모든 것
Kun Woo Kim
Kun Woo Kim
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, React, TypeScript, Next.js, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.
  • Kun Woo Kim
    WhiteMouseDev
    김건우
  • 깃허브
    포트폴리오
    velog
  • 전체
    오늘
    어제
  • 공지사항

    • [인사말] 이제 티스토리에서도 만나요! WhiteMouse⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (99) N
      • Frontend Development (38)
      • Backend Development (21) N
      • Algorithm (33) N
        • 백준 (11) N
        • 프로그래머스 (17)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (3)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    tailwindcss
    frontend development
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kun Woo Kim
두 개의 스택으로 큐(Queue) 구현하기: 실전 면접에서 마주한 낯선 자료구조 문제
상단으로

티스토리툴바