알고리즘

탐색

★☆★☆★☆★ 2020. 7. 15. 19:00

완전탐색/전체탐색(exhaustive search)

가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다.

1. Brute Force : for문과 if문을 이용하여 처음부터 끝까지 탐색하는 방법

2. 비트마스크

3. 순열 : 순열의 시간 복잡도는 O(N!)

4. 백트래킹

5. BFS : 그래프 이용

6. 재귀

 

브루트포스(brute-force search) 

완전탐색 알고리즘. 

=> 예외 없이 100%의 확률로 정답만을 출력 가능

문제 : 백준 덩치, 블랙잭, 분해합

* 암호학의 브루트 포스(brute force attack, 무차별 대입 공격)은 특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 것을 의미

 

선형 구조를 모두 탐색 - 순차 탐색

비선형 구조를 모두 탐색 - BFS(넓이 우선 탐색), DFS(깊이 우선 탐색)

 

순차탐색(Sequential Search)

순차적으로 비교해가면서 찾는 것. 선형 구조를 전체적으로 탐색

문제 : 백준 한수?

 

DFS(Depth-First Search, 깊이 우선 탐색)

다음 branch로 넘어가기 전 해당 branch를 완벽하게 탐색

즉, 넓게(wide) 탐색하기 전에 깊게(deep) 탐색

 

- 자기 자신을 호출하는 순환 알고리즘의 형태 => 재귀적

- 전위 순회(Pre-Oreder Traversals)를 포함한 다른 형태의 트리 순회는 모두 dfs의 한 종류

- 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사(무한루프에 빠질 위험이 있으므로)

 

BFS(Breath-First Search, 너비 우선 탐색)

시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문

즉, 깊게(deep) 탐색하기 전에 넓게(wide) 탐색

- 재귀적X

- 그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사(무한루프에 빠질 위험이 있으므로)

Queue를 이용 => FIFO

 

 

*검색 속도 DFS보다 BFS가 좀 더 빠름

 

 

백트래킹(Backtracking)

조건을 만족하는 모든 경우를 탐색

DFS + 가지치기(Pruning, 갈 필요 없는 루트는 고려하지 않음)

문제 : No-Queen, 스도쿠