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

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

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


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

자료구조 면접에서 "스택(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 시간 복잡도 개념을 자연스럽게 익힐 수 있습니다.

결론 및 인사이트

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

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

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

자료구조, 왜 배워야 할까? 스택부터 해시테이블까지 핵심 정리  (0) 2025.11.12
연결 리스트(Linked List) 완전 정복: 메모리 효율적인 동적 자료구조의 모든 것  (5) 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⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (143)
      • Frontend Development (64)
      • Backend Development (27)
      • AI · ML (3)
        • Computer Vision (3)
      • Algorithm (35)
        • 백준 (11)
        • 프로그래머스 (18)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (4)
      • Language (6)
        • JavaScript (6)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    AI
    CNN
    객체탐지
    transformer
    컴퓨터비전
    tailwindcss
    YOLO
    딥러닝
    rt-detr
    Object Detection
    모델비교
    frontend development
  • 최근 댓글

  • 최근 글

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

티스토리툴바