본문 바로가기
Python

[TIL] 241205 스택(Stack) 자료구조

by 좌우지간에 2024. 12. 5.

📚 TIL(Today I Learned): 스택(Stack) 자료구조와 활용

오늘은 스택(Stack) 자료구조를 공부했습니다. 스택은 후입선출(LIFO, Last In First Out) 방식으로 동작하는 자료구조입니다. 즉, 가장 마지막에 추가된 데이터가 먼저 제거됩니다. 파이썬에서는 스택을 list나 collections.deque로 구현할 수 있습니다.


🛠️ 스택 기본 구현

1. 리스트를 사용한 스택

stack = []

# 삽입 (push)
stack.append(1)  # 스택에 1 추가
stack.append(2)  # 스택에 2 추가
stack.append(3)  # 스택에 3 추가

# 제거 (pop)
print(stack.pop())  # 스택에서 가장 위의 값(3) 제거 후 출력
print(stack.pop())  # 스택에서 가장 위의 값(2) 제거 후 출력
print(stack.pop())  # 스택에서 가장 위의 값(1) 제거 후 출력

 

2. deque를 사용한 스택

from collections import deque

# deque를 사용하여 스택 생성
stack = deque()

# 삽입 (push)
stack.append(1)  # 스택에 1 추가
stack.append(2)  # 스택에 2 추가
stack.append(3)  # 스택에 3 추가

# 제거 (pop)
print(stack.pop())  # 스택에서 가장 위의 값(3) 제거 후 출력
print(stack.pop())  # 스택에서 가장 위의 값(2) 제거 후 출력
print(stack.pop())  # 스택에서 가장 위의 값(1) 제거 후 출력

📌 스택 활용 예제

1. 괄호 유효성 검사

괄호가 올바르게 닫혔는지 확인하는 코드입니다.

def is_valid_parentheses(s):
    stack = []  # 괄호를 저장할 스택
    mapping = {')': '(', '}': '{', ']': '['}  # 닫는 괄호에 대응하는 여는 괄호를 매핑
    
    for char in s:
        if char in mapping:  # 닫는 괄호인 경우
            # 스택에서 top 요소를 꺼냄. 스택이 비어 있다면 '#'을 반환
            top_element = stack.pop() if stack else '#'
            if mapping[char] != top_element:  # 매핑이 일치하지 않으면 False 반환
                return False
        else:  # 여는 괄호인 경우
            stack.append(char)  # 스택에 추가
    
    # 스택이 비어 있으면 True, 남아 있으면 False
    return not stack

# 테스트
print(is_valid_parentheses("()[]{}"))  # True (모든 괄호가 올바르게 닫힘)
print(is_valid_parentheses("(]"))      # False (열린 괄호와 닫힌 괄호가 일치하지 않음)

 

2. DFS(깊이 우선 탐색)

스택을 사용해 DFS를 구현하는 예제입니다.

def dfs_stack(graph, start):
    visited = set()  # 방문한 노드를 기록할 집합
    stack = [start]  # 탐색을 시작할 스택, 초기 노드를 추가
    
    while stack:
        node = stack.pop()  # 스택에서 노드를 꺼냄
        if node not in visited:  # 방문하지 않은 노드인 경우
            visited.add(node)  # 노드를 방문 처리
            # 인접한 노드 중 방문하지 않은 노드를 스택에 추가
            stack.extend(graph[node] - visited)
    
    return visited  # 방문한 노드 집합 반환

# 그래프 정의 (인접 리스트)
graph = {
    1: {2, 3, 4},
    2: {1, 5},
    3: {1},
    4: {1},
    5: {2}
}

# 테스트
print(dfs_stack(graph, 1))  # {1, 2, 3, 4, 5} (1번 노드에서 시작해 모든 노드를 탐색)

오늘 배운 점

  • 스택은 데이터를 쌓고 빼는 방식으로 동작하며, 최근 데이터 우선 처리가 필요한 문제에 적합하다.
  • 괄호 검사, DFS 등 다양한 문제에서 스택을 활용할 수 있다.
  • 파이썬의 list와 collections.deque를 사용하여 스택을 구현할 수 있다.

 

'Python' 카테고리의 다른 글

클래스와 메서드 복습  (3) 2024.12.21
[TIL] 241212 함수와 클래스 보충  (4) 2024.12.12
[TIL] 241203 파이썬 데이터 분석  (1) 2024.12.03
[TIL] 241202 return의 활용  (2) 2024.12.02
[TIL] 241113  (3) 2024.11.13