def dfs(graph, v, visited):
# 현재 노드를 방문 처리
visited[v] = True
print(v, end=' ')
# 현재 노드와 연결된 다른 노드를 재귀적으로 방문
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
graph = [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
visited = [False] * 9
dfs(graph, 1, visited)
from collections import deque
def bfs(graph, start, visited):
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
graph = [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
visited = [False] * 9
bfs(graph, 1, visited)
루트
라고 한다. (루트는 트리에 하나만 존재)리프
라고 한다. (가지가 더 이상 뻗어나갈 수 없는 마지막에 노드가 있다는 것)import sys
input = sys.stdin.readline
N = int(input())
tree = {} # 딕셔너리로 루트와 자식 관계를 표현 {'A':['B','C']}
for n in range(N):
root, left, right = input().split()
tree[root] = [left, right]
# 재귀로 순회해준다
def pre_order(root): # 전위
if root != '.': # 자식 노드가 있을때
print(root, end='') # 루트 방문하고
pre_order(tree[root][0]) # 왼쪽자식
pre_order(tree[root][1]) # 오른쪽자식
def in_order(root): # 중위
if root != '.':
in_order(tree[root][0])
print(root, end='')
in_order(tree[root][1])
def post_order(root): # 후위
if root != '.':
post_order(tree[root][0])
post_order(tree[root][1])
print(root, end='')
pre_order('A')
print()
in_order('A')
print()
post_order('A')
서로소 집합 자료구조
Union(1, 4)
연산을 처리하면 노드 1과 노드 4의 루트 노드를 각각 찾는다. 현재 루트 노드는 각각 1과 4이므로 더 큰 번호에 해당하는 루트 노드 4의 부모를 1로 설정한다.Union(2, 3)
3의 부모값은 2Union(2, 4)
노드 2와 노드 4의 루트 노드는 각각 2와 1이므로 더 큰 번호에 해당하는 루트 노드 2의 부모를 1로 만든다.Union(5, 6)
을 연산하면 6의 부모값은 5가 됨.# 특정 원소가 속한 집합을 찾기
def find_parent(parent, x):
# 루트 노드를 찾을 때까지 재귀
if parent[x] != x: # 루트노드가 자기 자신이 아니라면
return find_parent(parent, parent[x])
return x
# 두 원소가 속한 집합을 합치기
def union_parent(parent, a, b):
a = find_parent(parent, a)
b = find_parent(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
# 노드의 개수와 간선의 개수 입력 받기
v, e = map(int, input().split())
parent = [0] * (v + 1) # 부모 테이블 초기화
# 부모 테이블상에서, 부모를 자기 자신으로 초기화
for i in range(1, v + 1):
parent[i] = i
# Union 연산을 각각 수행
for i in range(e):
a, b = map(int, input().split())
union_parent(parent, a, b)
# 각 원소가 속한 집합 출력하기
print('각 원소가 속한 집합: ', end='')
for i in range(1, v + 1)
print(find_parent(parent, i), end='')
print()
# 부모 테이블 내용 출력
print('부모 테이블: ', end='')
for i in rnage(1, v + 1):
print(parent[i], end='')
찾기 함수를 최적화 하기 위한 방법
찾기 함수를 재귀적으로 호출한 뒤에 부모 테이블 값을 바로 갱신한다.
코드
def find_parent(parent, x):
if parent[x] != x:
parent[x] = find_parent(parent, parent[x])
return parent[x]
1.8 시스템은 네트워크를 사용하여 다른 시스템과 통신한다
1.9.2 동시성과 병렬성
참고 - 컴퓨터 시스템(Coputer Systems A Programmer's Perspective 3rd)
WEEK03에는 한 문제를 풀었다. 지난 주에 한 문제도 구현하지 못해 뒤쳐지는 느낌이 들어 굉장히 괴로웠는데, 이번 주엔 풀었으니 지난주보다는 성장했구나라는 생각이 들었다. 점점 알고리즘이 이런것이구나하며 맛을 알아가는 단계라고 생각한다. 공부를 어떻게 해야할지 감이 온다. 욕심내지말고 알고리즘 단계가 끝나더라도 조금씩이라도 꾸준히 하다보면 할 수 있을거란 믿음을 가지고 어제보다 나은 오늘이 되기 위해 열심히 해야겠다는 생각이 들었다.
WEEK03 풀었던 문제 소스코드 - https://github.com/yeopto/SW-jungle/tree/main/WEEK03