[개발] 파이썬

5.1. 기본 자료구조 활용

브랜든정 2024. 12. 27. 10:41
반응형

파이썬은 다양한 자료구조를 제공하여 개발자들이 효율적인 프로그래밍을 할 수 있도록 돕습니다. 스택, 큐, 데크는 이러한 자료구조 중 하나로, 각각의 특징과 사용법을 이해하는 것이 중요합니다. 이 글에서는 파이썬에서 스택, 큐, 데크를 사용하는 방법과 우선순위 큐를 구현하는 방법에 대해 자세히 설명하겠습니다.

1. 스택 (Stack)

스택은 LIFO(Last In First Out) 방식으로 데이터를 저장하는 자료구조입니다. 가장 최근에 추가된 데이터가 가장 먼저 삭제되는 구조입니다. 파이썬에서 스택을 구현하는 방법은 다음과 같습니다.

1.1 스택의 기본적인 연산

  • push: 데이터를 스택에 추가합니다.
  • pop: 데이터를 스택에서 삭제합니다.
  • peek: 스택의 최상단 데이터를 확인합니다.

파이썬의 list를 사용하여 스택을 구현할 수 있습니다. 예를 들어, 다음과 같이 스택을 구현할 수 있습니다:

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        else:
            raise IndexError("Stack is empty")

    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        else:
            raise IndexError("Stack is empty")

    def is_empty(self):
        return len(self.items) == 0

1.2 스택의 활용 예제

스택은 함수 호출 스택, 역순 문자열 출력, 괄호의 유효성 검사 등 다양한 곳에서 사용됩니다. 예를 들어, 괄호의 유효성 검사를 다음과 같이 구현할 수 있습니다:

def is_valid_parentheses(s):
    stack = []
    parentheses_map = {')': '(', '}': '{', ']': '['}

    for char in s:
        if char in parentheses_map.values():
            stack.append(char)
        elif char in parentheses_map.keys():
            if not stack or parentheses_map[char] != stack.pop():
                return False

    return not stack

print(is_valid_parentheses("({[]})"))  # True
print(is_valid_parentheses("({[})"))   # False

2. 큐 (Queue)

큐는 FIFO(First In First Out) 방식으로 데이터를 저장하는 자료구조입니다. 가장 먼저 추가된 데이터가 가장 먼저 삭제되는 구조입니다. 파이썬에서 큐를 구현하는 방법은 다음과 같습니다.

2.1 큐의 기본적인 연산

  • enqueue: 데이터를 큐에 추가합니다.
  • dequeue: 데이터를 큐에서 삭제합니다.
  • peek: 큐의 최상단 데이터를 확인합니다.

파이썬의 deque 모듈을 사용하여 큐를 구현할 수 있습니다. 예를 들어, 다음과 같이 큐를 구현할 수 있습니다:

from collections import deque

class Queue:
    def __init__(self):
        self.items = deque()

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        if not self.is_empty():
            return self.items.popleft()
        else:
            raise IndexError("Queue is empty")

    def peek(self):
        if not self.is_empty():
            return self.items[0]
        else:
            raise IndexError("Queue is empty")

    def is_empty(self):
        return len(self.items) == 0

2.2 큐의 활용 예제

큐는 작업 스케줄링, 네트워크 트래픽 제어, 이벤트 처리 등 다양한 곳에서 사용됩니다. 예를 들어, 작업 스케줄링을 다음과 같이 구현할 수 있습니다:

def schedule_tasks(tasks):
    queue = Queue()
    for task in tasks:
        queue.enqueue(task)

    while not queue.is_empty():
        task = queue.dequeue()
        print(f"Processing task: {task}")

schedule_tasks(["Task A", "Task B", "Task C"])

3. 데크 (Deque)

데크는 양방향으로 데이터를 추가/삭제할 수 있는 자료구조입니다. 데크는 스택과 큐의 특징을 모두 가지고 있습니다. 파이썬에서 데크를 구현하는 방법은 다음과 같습니다.

3.1 데크의 기본적인 연산

  • append: 데이터를 데크의 오른쪽 끝에 추가합니다.
  • appendleft: 데이터를 데크의 왼쪽 끝에 추가합니다.
  • pop: 데이터를 데크의 오른쪽 끝에서 삭제합니다.
  • popleft: 데이터를 데크의 왼쪽 끝에서 삭제합니다.

파이썬의 deque 모듈을 사용하여 데크를 구현할 수 있습니다. 예를 들어, 다음과 같이 데크를 구현할 수 있습니다:

from collections import deque

class Deque:
    def __init__(self):
        self.items = deque()

    def append(self, item):
        self.items.append(item)

    def appendleft(self, item):
        self.items.appendleft(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        else:
            raise IndexError("Deque is empty")

    def popleft(self):
        if not self.is_empty():
            return self.items.popleft()
        else:
            raise IndexError("Deque is empty")

    def is_empty(self):
        return len(self.items) == 0

3.2 데크의 활용 예제

데크는 스택과 큐의 특징을 모두 가지고 있기 때문에 다양한 곳에서 사용됩니다. 예를 들어, 양방향으로 데이터를 추가/삭제하는 데크를 다음과 같이 구현할 수 있습니다:

def process_data(data):
    deque = Deque()
    for item in data:
        deque.append(item)
        print(f"Added item: {item}")

    while not deque.is_empty():
        item = deque.pop()
        print(f"Removed item: {item}")

process_data([1, 2, 3, 4, 5])

4. 우선순위 큐 (Priority Queue)

우선순위 큐는 데이터를 우선순위에 따라 처리하는 자료구조입니다. 파이썬에서 우선순위 큐를 구현하는 방법은 다음과 같습니다.

4.1 우선순위 큐의 기본적인 연산

  • enqueue: 데이터를 우선순위 큐에 추가합니다.
  • dequeue: 데이터를 우선순위 큐에서 삭제합니다.
  • peek: 우선순위 큐의 최상단 데이터를 확인합니다.

파이썬의 heapq 모듈을 사용하여 우선순위 큐를 구현할 수 있습니다. 예를 들어, 다음과 같이 우선순위 큐를 구현할 수 있습니다:

import heapq

class PriorityQueue:
    def __init__(self):
        self.items = []

    def enqueue(self, item, priority):
        heapq.heappush(self.items, (priority, item))

    def dequeue(self):
        if not self.is_empty():
            return heapq.heappop(self.items)[1]
        else:
            raise IndexError("Priority Queue is empty")

    def peek(self):
        if not self.is_empty():
            return self.items[0][1]
        else:
            raise IndexError("Priority Queue is empty")

    def is_empty(self):
        return len(self.items) == 0

4.2 우선순위 큐의 활용 예제

우선순위 큐는 작업 스케줄링, 네트워크 트래픽 제어, 이벤트 처리 등 다양한 곳에서 사용됩니다. 예를 들어, 작업 스케줄링을 다음과 같이 구현할 수 있습니다:

def schedule_tasks(tasks):
    priority_queue = PriorityQueue()
    for task in tasks:
        priority_queue.enqueue(task, len(tasks) - tasks.index(task))

    while not priority_queue.is_empty():
        task = priority_queue.dequeue()
        print(f"Processing task: {task}")

schedule_tasks(["Task A", "Task B", "Task C"])

파이썬의 스택, 큐, 데크는 각각의 특징과 사용법을 이해하는 것이 중요합니다. 우선순위 큐는 데이터를 우선순위에 따라 처리하는 자료구조로, 작업 스케줄링, 네트워크 트래픽 제어, 이벤트 처리 등 다양한 곳에서 사용됩니다. 파이썬의 list, deque, heapq 모듈을 사용하여 각 자료구조를 구현할 수 있으며, 다양한 활용 예제를 통해 효율적인 프로그래밍을 할 수 있습니다.

반응형

'[개발] 파이썬' 카테고리의 다른 글

5.3. 파이썬 고급 알고리즘  (0) 2024.12.27
5.2. 파이썬 알고리즘 기초  (0) 2024.12.27
4.3. 파이썬 예외 처리  (0) 2024.12.27
4.2. CSV와 JSON 처리  (2) 2024.12.27
4.1. 텍스트와 바이너리 파일 다루기  (0) 2024.12.27