Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 스택 완벽 가이드: 리스트와 deque로 구현하는 방법

스택(Stack)은 다양한 분야에서 폭넓게 활용되는 중요한 자료구조입니다.

프로그래밍에서 스택은 데이터를 LIFO(Last-In, First-Out, 후입선출) 방식으로 저장합니다. 즉, 가장 마지막에 저장된 항목이 가장 먼저 처리됩니다.

그렇다면 파이썬에서는 어떻게 스택을 만들 수 있을까요? 이 가이드에서는 그 답을 자세히 알아봅니다. 글을 끝까지 읽고 나면 파이썬에서 스택을 만들고 다루는 데 능숙해져 있을 것입니다.

파이썬 스택이란?

스택은 데이터를 후입선출(LIFO) 방식으로 저장하는 자료구조입니다.

이 개념을 쉽게 이해하려면 접시 더미를 떠올려 보세요. 설거지할 접시가 쌓여 있을 때 가장 먼저 집게 되는 것은 맨 위의 접시입니다. 접시를 하나씩 치우다 보면 아래쪽에 있는 접시들도 차례로 꺼내게 됩니다.

스택은 파이썬의 큐(Queue)와 정반대로 동작합니다. 큐는 가장 먼저 추가된 항목을 제거하고(FIFO, 선입선출), 스택은 가장 최근에 추가된 항목을 제거합니다(LIFO).

스택은 일반적으로 두 가지 핵심 연산을 지원합니다. push(푸시)는 스택의 맨 위에 항목을 추가하는 연산이고, pop(팝)은 스택 맨 위의 항목을 제거하는 연산입니다.

파이썬에서 스택을 구현하는 대표적인 방법은 두 가지입니다. 내장 리스트(list)를 사용하는 방법과 collections.deque() 클래스를 사용하는 방법입니다. 각각의 방법을 자세히 살펴보겠습니다.

방법 1: 파이썬 내장 리스트로 스택 만들기

파이썬의 내장 리스트 자료형을 사용하면 간단하게 스택을 만들 수 있습니다.

파이썬 리스트는 배열 기반으로 구현되어 있어 항목을 쉽게 추가하고 제거할 수 있습니다. 또한 값을 삽입한 순서가 그대로 유지되기 때문에 리스트의 첫 번째 항목과 마지막 항목을 손쉽게 다룰 수 있습니다.

예를 들어, 한 반의 숙제 제출 목록을 저장하는 스택을 만든다고 가정해 보겠습니다. 선생님은 과제가 쌓인 순서대로 채점하려고 합니다. 즉, 가장 먼저 제출한 과제는 스택의 맨 아래에, 가장 마지막에 제출한 과제는 스택의 맨 위에 위치하게 됩니다.

스택에 항목 추가하기

스택에 항목을 추가하려면 append() 메서드를 사용합니다. 다음 코드로 숙제 제출 스택을 만들 수 있습니다:

assignments = []

assignments.append("Hannah")
assignments.append("Benny")
assignments.append("Gordon")

print(assignments)

실행 결과:

['Hannah', 'Benny', 'Gordon']

위 코드에서는 먼저 assignments라는 이름의 리스트를 선언했습니다. 그다음 append() 메서드를 사용해 제출된 과제 세 개를 리스트에 추가했습니다. Hannah, Benny, Gordon 순서로 추가되었으며, Gordon이 가장 마지막에 제출했기 때문에 리스트의 마지막 위치에 배치됩니다.

스택에서 항목 제거하기

Gordon의 과제 채점을 마쳤고, 이제 어떤 과제를 다음으로 채점해야 하는지 확인하고 싶다고 가정해 보겠습니다. 이때는 스택 맨 위의 항목을 제거하면 됩니다.

스택에서 항목을 제거하려면 pop() 메서드를 사용합니다. 스택의 맨 위 항목을 제거하는 코드는 다음과 같습니다:

assignments = []

assignments.append("Hannah")
assignments.append("Benny")
assignments.append("Gordon")
assignments.pop()

print(assignments)

실행 결과:

['Hannah', 'Benny']

pop() 메서드를 통해 Gordon의 이름이 스택에서 제거되었고, 이제 스택에는 Hannah와 Benny 두 개의 항목만 남아 있습니다.

방법 2: collections.deque 클래스로 스택 만들기

collections 라이브러리의 deque 클래스를 사용하면 양방향 큐(double-ended queue)를 만들 수 있습니다.

deque 객체는 이중 연결 리스트(doubly-linked list)로 구현되어 있어 요소를 삽입하거나 삭제할 때 안정적이고 일관된 성능을 보여줍니다. 또한 collections 라이브러리는 파이썬 표준 라이브러리에 포함되어 있으므로 외부 라이브러리를 설치하지 않고도 바로 임포트해서 사용할 수 있다는 장점이 있습니다.

collections.deque 클래스를 사용하려면 먼저 import 문으로 불러와야 합니다:

from collections import deque

앞서 살펴본 숙제 예제를 다시 활용해 deque 클래스의 작동 방식을 알아보겠습니다.

deque 스택에 항목 추가하기

deque 스택에 항목을 추가할 때도 append() 메서드를 사용합니다. deque 클래스로 숙제 제출 목록을 만드는 코드는 다음과 같습니다:

from collections import deque

assignments = deque()

assignments.append("Hannah")
assignments.append("Benny")
assignments.append("Gordon")

print(assignments)

실행 결과:

deque(['Hannah', 'Benny', 'Gordon'])

코드를 하나씩 살펴보겠습니다. 먼저 collections 라이브러리에서 deque 클래스를 임포트합니다. 그다음 deque()로 deque 객체를 생성해 assignments 변수에 할당합니다.

이어서 Hannah, Benny, Gordon 세 개의 이름을 assignments deque에 추가하고, 마지막으로 deque의 내용을 콘솔에 출력합니다.

실행 결과를 보면 데이터가 리스트가 아닌 deque 형태로 저장된 것을 확인할 수 있습니다(결과가 deque()로 감싸져 있는 점에서 알 수 있습니다). 데이터가 여전히 스택처럼 동작하지만, 내부적으로는 deque 구조를 사용하고 있기 때문입니다.

deque 스택에서 항목 제거하기

deque 스택에서 항목을 제거할 때는 pop() 메서드를 사용합니다.

Gordon과 Benny의 과제 채점을 방금 마쳤다고 가정해 보겠습니다. 두 항목을 스택에서 제거하는 코드는 다음과 같습니다:

from collections import deque

assignments = deque()

assignments.append("Hannah")
assignments.append("Benny")
assignments.append("Gordon")
assignments.pop()
assignments.pop()

print(assignments)

실행 결과:

deque(['Hannah'])

위 코드에서는 먼저 값 세 개를 가진 deque 스택을 생성합니다. 그다음 pop() 문을 두 번 실행하는데, pop()이 실행될 때마다 스택 맨 위의 항목이 제거됩니다. 따라서 Gordon, Benny 순서로 제거되고, 최종적으로 Hannah만 스택에 남게 됩니다.

파이썬 deque 클래스에 대해 더 깊이 알고 싶다면 파이썬 큐와 deque 관련 튜토리얼을 참고해 보세요.

마무리

스택은 데이터를 후입선출(LIFO) 방식으로 저장하는 자료구조입니다. 파이썬에서 스택을 구현하는 방법은 여러 가지가 있지만, 가장 실용적인 두 가지는 내장 리스트 구조를 사용하는 방법과 collections.deque() 클래스를 사용하는 방법입니다.

이 튜토리얼에서는 예제와 함께 리스트와 collections.deque()를 사용해 파이썬에서 스택을 만드는 방법을 알아보았습니다. 이제 여러분도 프로 파이썬 개발자처럼 직접 스택을 만들어 활용할 준비가 되었습니다!