반응형
Day 1: 스택의 기본 개념
- 강의 내용:
- 스택의 정의와 특징
- 스택의 개념과 용도
- 후입선출(LIFO) 원리
- 스택의 주요 연산
- push, pop, peek, is_empty
- 스택의 정의와 특징
- 실습:
- 리스트를 이용한 스택 구현
# 리스트를 사용한 스택 구현
class Stack:
def __init__(self):
self.stack = []
def push(self, item):
self.stack.append(item)
def pop(self):
if not self.is_empty():
return self.stack.pop()
return None
def peek(self):
if not self.is_empty():
return self.stack[-1]
return None
def is_empty(self):
return len(self.stack) == 0
def size(self):
return len(self.stack)
def display(self):
print(self.stack)
# 스택 사용 예제
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
stack.display() # [1, 2, 3]
print("Pop:", stack.pop()) # Pop: 3
stack.display() # [1, 2]
print("Peek:", stack.peek()) # Peek: 2
Day 2: 스택의 응용
- 강의 내용:
- 스택의 응용 사례
- 괄호 검사
- 중위 표현식을 후위 표현식으로 변환
- 스택을 사용한 알고리즘
- 스택의 응용 사례
- 실습:
- 괄호 검사 알고리즘 구현
# 괄호 검사 알고리즘
def is_balanced(expression):
stack = Stack()
pairs = {')': '(', '}': '{', ']': '['}
for char in expression:
if char in '({[':
stack.push(char)
elif char in ')}]':
if stack.is_empty() or stack.pop() != pairs[char]:
return False
return stack.is_empty()
# 괄호 검사 예제
print(is_balanced("(){}[]")) # True
print(is_balanced("({[)]")) # False
Day 3: 큐의 기본 개념
- 강의 내용:
- 큐의 정의와 특징
- 큐의 개념과 용도
- 선입선출(FIFO) 원리
- 큐의 주요 연산
- enqueue, dequeue, front, is_empty
- 큐의 정의와 특징
- 실습:
- 리스트를 이용한 큐 구현
# 리스트를 사용한 큐 구현
class Queue:
def __init__(self):
self.queue = []
def enqueue(self, item):
self.queue.append(item)
def dequeue(self):
if not self.is_empty():
return self.queue.pop(0)
return None
def front(self):
if not self.is_empty():
return self.queue[0]
return None
def is_empty(self):
return len(self.queue) == 0
def size(self):
return len(self.queue)
def display(self):
print(self.queue)
# 큐 사용 예제
queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.display() # [1, 2, 3]
print("Dequeue:", queue.dequeue()) # Dequeue: 1
queue.display() # [2, 3]
print("Front:", queue.front()) # Front: 2
Day 4: 큐의 응용
- 강의 내용:
- 큐의 응용 사례
- BFS(너비 우선 탐색)
- 프린터 대기열 관리
- 큐를 사용한 알고리즘
- 큐의 응용 사례
- 실습:
- BFS 알고리즘 구현
# 그래프를 표현하는 클래스
class Graph:
def __init__(self, vertices):
self.graph = {i: [] for i in range(vertices)}
def add_edge(self, u, v):
self.graph[u].append(v)
def bfs(self, start):
visited = [False] * len(self.graph)
queue = Queue()
queue.enqueue(start)
visited[start] = True
while not queue.is_empty():
node = queue.dequeue()
print(node, end=" ")
for neighbor in self.graph[node]:
if not visited[neighbor]:
queue.enqueue(neighbor)
visited[neighbor] = True
# BFS 사용 예제
g = Graph(4)
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 2)
g.add_edge(2, 0)
g.add_edge(2, 3)
g.add_edge(3, 3)
print("BFS 시작점 2:")
g.bfs(2) # 2 0 3 1
Day 5: 우선순위 큐
- 강의 내용:
- 우선순위 큐의 개념
- 우선순위 큐의 정의와 용도
- 힙을 사용한 우선순위 큐 구현
- 우선순위 큐의 주요 연산
- insert, delete_min
- 우선순위 큐의 개념
- 실습:
- 힙을 사용한 우선순위 큐 구현
import heapq
# 힙을 사용한 우선순위 큐 구현
class PriorityQueue:
def __init__(self):
self.heap = []
def insert(self, item):
heapq.heappush(self.heap, item)
def delete_min(self):
if not self.is_empty():
return heapq.heappop(self.heap)
return None
def is_empty(self):
return len(self.heap) == 0
def display(self):
print(self.heap)
# 우선순위 큐 사용 예제
pq = PriorityQueue()
pq.insert(3)
pq.insert(1)
pq.insert(2)
pq.display() # [1, 3, 2]
print("Delete min:", pq.delete_min()) # Delete min: 1
pq.display() # [2, 3]
Day 6: 스택과 큐의 비교 및 선택
- 강의 내용:
- 스택과 큐의 비교
- 자료 구조의 특성과 용도 비교
- 스택과 큐의 시간 복잡도 분석
- 상황에 따른 자료 구조 선택
- 스택과 큐의 비교
- 실습:
- 다양한 상황에서 스택과 큐를 선택하는 예제
# 스택과 큐 비교 예제
def reverse_string(s):
stack = Stack()
for char in s:
stack.push(char)
reversed_str = ""
while not stack.is_empty():
reversed_str += stack.pop()
return reversed_str
def process_tasks(task_list):
queue = Queue()
for task in task_list:
queue.enqueue(task)
while not queue.is_empty():
task = queue.dequeue()
print(f"Processing task: {task}")
# 예제 사용
print("Reversed string:", reverse_string("hello")) # olleh
process_tasks(["task1", "task2", "task3"]) # Processing task: task1, task2, task3
Day 7: 종합 연습 및 프로젝트
- 강의 내용:
- 스택과 큐를 사용한 종합 연습 문제 풀이
- 다양한 스택과 큐 관련 문제
- Q&A 세션
- 미니 프로젝트
- 스택과 큐를 활용한 간단한 프로그램 구현
- 예: 웹 브라우저의 뒤로 가기/앞으로 가기 기능
- 스택과 큐를 사용한 종합 연습 문제 풀이
- 실습:
- 종합 연습 문제 풀기
- 미니 프로젝트 작성 및 발표
# 연습 문제 1: 스택을 사용한 문자열 회문 검사
def is_palindrome(s):
stack = Stack()
for char in s:
stack.push(char)
reversed_str = ""
while not stack.is_empty():
reversed_str += stack.pop()
return s == reversed_str
print("Is 'radar' a palindrome?", is_palindrome("radar")) # True
print("Is 'hello' a palindrome?", is_palindrome("hello")) # False
# 미니 프로젝트 예제: 웹 브라우저의 뒤로 가기/앞으로 가기 기능
class Browser:
def __init__(self):
self.history = Stack()
self.forward_stack = Stack()
def visit(self, url):
print(f"Visiting {url}")
self.history.push(url)
self.forward_stack = Stack() # Reset forward stack
def back(self):
if not self.history.is_empty():
url = self.history.pop()
self.forward_stack.push(url)
if not self.history.is_empty():
print(f"Going back to {self.history.peek()}")
else:
print("No pages in history")
def forward(self):
if not self.forward_stack.is_empty():
url = self.forward_stack.pop()
self.history.push(url)
print(f"Going forward to {url}")
# 웹 브라우저 사용 예제
browser = Browser()
browser.visit("google.com")
browser.visit("stackoverflow.com")
browser.visit("github.com")
browser.back() # Going back to stackoverflow.com
browser.back() # Going back to google.com
browser.forward() # Going forward to stackoverflow.com
이 강의는 파이썬의 자료구조 중 스택과 큐를 익히는 것을 목표로 하며, 각 강의는 이론과 실습을 포함합니다. 다음 주차에 대한 상세 강의를 원하시면 말씀해 주세요!
반응형
'-----ETC2----- > 자료구조' 카테고리의 다른 글
[자료구조] Week 6: 트리 I - 트리의 개념과 이진 트리 (0) | 2024.06.01 |
---|---|
[자료구조] Week 5: 해시 테이블 (0) | 2024.06.01 |
[자료구조] Week 4: 우선순위 큐와 힙 (0) | 2024.06.01 |
[자료구조] Week 2: 연결 리스트 (0) | 2024.06.01 |
[자료구조] Week 1: 자료구조 개요 및 배열 (0) | 2024.06.01 |