
선행 되어야 할 공부 : Stack, Queue, 인접 리스트
특징
DFS는 스택보다는 스택 성질을 갖는 재귀 함수로 많이 구현한다.

Stack을 하나 만들고, 처음에는 Stack 안에 노드가 없으니까 시작할 노드를 선택한다.
child node를 stack에 넣을 때는 한번 담은 노드는 다시 넣지 않는다.

0번 노드를 꺼내 출력하고, 0번의 child node인 1번 노드를 Stack에 담기

1번 노드를 꺼내고, 1번의 child node 들 (2, 3번 노드)를 Stack에 담고, 1번 노드를 출력한다.

Stack에서 맨 위에 있는 3번 노드 꺼내고, child node들 (2, 4, 5번인데 2번은 이미 있으니까 4, 5번만 담음)을 Stack에 담고, 3번 노드 출력.

5번 꺼내고, 6, 7번 노드 담고, 출력하기

7번 꺼내고, child node없으므로 더 안 담고, 출력하기.

6번 꺼내고, child node 8번 노드 담고, 출력하기

8번 꺼내고, 4번 꺼내고, 2번 꺼내기
순회 종료.
https://www.acmicpc.net/problem/11724
https://www.acmicpc.net/problem/2023
https://www.acmicpc.net/problem/13023
특징

Queue를 하나 만들고, 처음에는 노드가 없으니까 시작할 노드를 선택한다. DFS와 마찬가지로 Queue에 들어간 노드는 더 담지 않고, 위에서 아래 순서로 노드들을 꺼내고 출력한다.

0번 노드 담기

0번 꺼내고, child node 1번 노드 담고, 출력하기

1번 꺼내고, child node 들 (2, 3번 노드)을 담고, 1번 출력하기

2번 꺼내고, child node 4번 담고, 2번 출력하기

3번 꺼내고, child node 5번 담고, 3번 출력하기

4번 꺼내고, 없으니까 담지 않고 4번 출력하기

5번 꺼내고, child node 6, 7번 담고, 5번 출력하기

6번 꺼내고, child node 8번 담고, 6번 출력하기

7번 꺼내고 출력, 8번 꺼내고 출력
종료
https://www.acmicpc.net/problem/2178
https://www.acmicpc.net/problem/1167
DFS 경로 : 0 > 1 > 3 > 5 > 7 > 6 > 8 > 4 > 2
BFS 경로 : 0 > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8
이진 탐색이란 데이터가 정렬된 상태에서 원하는 값을 찾아내는 알고리즘이다.
O(logN)이다.일정한 순서로 정렬된 데이터에서 다음 4가지 과정을 반복한다.
다음은 오름차순을 기준으로 하는 과정이며, 내림차순은 조건을 반대로 하여 과정을 반복하면 된다.


# 반복문 방식
def binary_search_iterative(target, data_list):
left = 0
right = len(data_list) - 1
while left <= right:
mid = (left + right) // 2
if data_list[mid] == target: # 중간 값이 검색 값과 같은 경우
return mid
elif data_list[mid] < target: # 중간 값이 검색 값보다 작을 경우
left = mid + 1
else: # 중간 값이 검색 값보다 클 경우
right = mid - 1
return -1 # 찾는 값 없음
elif data_list[mid] < target : target이 오른쪽에 있다는 의미이므로, 탐색 범위를 오른쪽으로 좁히기 위해 left값 변경else :target이 왼쪽에 있다는 의미이므로, 탐색 범위를 왼쪽으로 좁히기 위해 left값 변경left가 right보다 크면, 탐색 범위가 없다는 의미이므로, -1 returndef binary_search_recursive(target, data_list, left, right):
if left > right: # 찾는 값 없음
return -1
mid = (left + right) // 2
if data_list[mid] == target: # 중간 값이 검색 값과 같은 경우
return mid
elif data_list[mid] < target: # 중간 값이 검색 값보다 작을 경우
return binary_search_recursive(target, data_list, mid + 1, right)
else: # 중간 값이 검색 값보다 클 경우
return binary_search_recursive(target, data_list, left, mid - 1)
elif data_list[mid] < target : target이 오른쪽에 있다는 의미이므로, 탐색 범위를 오른쪽으로 좁혀서 ,mid + 1부터 right까지 다시 재귀 호출else :target이 왼쪽에 있다는 의미이므로, 탐색 범위를 왼쪽으로 좁혀서 ,left부터 mid-1까지 다시 재귀 호출left가 right보다 크면, 탐색 범위가 없다는 의미이므로, -1 return