stack = []
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()
print(stack) # 최하단 원소부터 출력 # [5,2,3,1]
print(stack[::-1]] # 최상단 원소부터 출력 # [1,3,2,5]
append()
와 pop()
메서드를 이용하면 스택 자료구조와 동일하게 동작append()
: 리스트 가장 뒤쪽에 데이터 삽입pop()
: 리스트 가장 뒤쪽 데이터를 꺼냄from collections import deque
# 큐(queue) 구현을 위해 deque 라이브러리 사용
queue = deque()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(4)
queue.append(1)
queue.popleft()
print(queue) # 먼저 들어온 순서대로 출력 # deque([3, 7, 4, 1])
queue.reverse() # 역순으로 바꾸기
print(queue) # 나중에 들어온 순서대로 출력 # deque([1, 4, 7, 3])
print(list(queue)) # deque 객체를 리스트 자료형으로 변경 # [1, 4, 7, 3]
# 간단한 재귀한수 예시
def hello():
print('Hello, world!')
hello()
hello()
# Hello, world!
# Hello, world!
# Hello, world!
# ...
# RecursionError: maximum recursion depth exceeded while pickling an object
if문
을 이용하여 꼭 종료 조건을 구현!def recursive(i):
# 100번째 출력했을 때 종료되도록 종료 조건 명시
if i == 100:
return
print(i, '번째 재귀 함수에서', i+1,'번째 재귀 함수를 호출')
recursive(i+1)
print(i,'번째 재귀 함수를 종료')
recursive(1)
# 1 번째 재귀 함수에서 2 번째 재귀 함수를 호출
# 2 번째 재귀 함수에서 3 번째 재귀 함수를 호출
# ...
# 99 번째 재귀 함수에서 100 번째 재귀 함수를 호출
# 99 번째 재귀 함수를 종료
# 98 번째 재귀 함수를 종료
# ...
# 2 번째 재귀 함수를 종료
# 1 번째 재귀 함수를 종료
# 반복적으로 구현한 n!
def fatorial_iterative(n):
result = 1
# 1부터 n까지의 수를 차례대로 곱하기
for i in range(1, n+1):
result *= i
return result
# 재귀적으로 구현한 n!
def factorial_recursive(n):
# n이 1이하인 경우 1을 반환
if n <= 1:
return 1
# n! = n * (n-1)!를 그대로 코드로 작성
return n * factorial_recursive(n-1)
# 각각의 방식으로 구현한 n! 출력 (n = 5)
print('반복적으로 구현',fatorial_iterative(5)) # 반복적으로 구현 120
print('재귀적으로 구현',factorial_recursive(5)) # 재귀적으로 구현 120
999999999
, 987654321
등의 값으로 초기화하는 경우가 많음INF = 999999999 # 무한의 비용 선언
# 2차원 리스트를 이용해 인접 행렬 표현
graph = [
[0,7,5],
[7, 0, INF],
[5, INF, 0]
]
print(graph) # [[0, 7, 5], [7, 0, 999999999], [5, 999999999, 0]]
# 행(Row)이 3개인 2차원 리스트로 인접 리스트 표현
# [[], [], []]
graph= [[] for _ in range(3)]
# 노드 0에 연결된 노드 정보 저장(노드, 거리)
graph[0].append((1,7))
graph[0].append((2,5))
# 노드 1에 연결된 노드 정보 저장(노드, 거리)
graph[1].append((0,7))
# 노드 2에 연결된 노드 정보 저장(노드, 거리)
graph[2].append((0,5))
print(graph) # [[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]]
def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v,end = ' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
# graph[1] = [2, 3, 8]
for i in graph[v]:
if not visited[i]:
dfs(graph, i ,visited)
# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph =[
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
# [False, False, False, False, False, False, False, False, False]
visited = [False] * 9
# 정의된 DFS 함수 호출
dfs(graph, 1, visited) # 스택에 들어간 순서 = 탐색 순서 = 1 2 7 6 8 3 4 5
from collections import deque
def bfs(garph, start, visited):
# 큐(deque) 구현을 위해 deque라이브러리 사용
queue = deque([start])
# 현재 노드를 방문 처리
visited[start] = True
# 큐가 비어질 때까지 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력
v = queue.popleft()
print(v, end= ' ')
# 해단 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph =[
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 9
# 정의된 BFS 함수 호출
bfs(graph, 1, visited) # 큐에 들어간 순서 = 탐색 순서 = 1 2 3 8 7 4 5 6
DFS | BFS | |
---|---|---|
동작 원리 | 스택 | 큐 |
구현 방법 | 재귀 함수 이용 | 큐 자료구조 이용, while |
출처
이것이 코딩테스트다 with 파이썬
https://covenant.tistory.com/132