Algorytm/기초

[Algorythm-개념] 완전탐색

JiWonSon 2021. 9. 26. 18:33

1. 완전탐색이란?

- 모든 경우의 수를 고려하는 탐색 알고리즘 

- 영어로는 Exhaustive Search라고 한다. 가능한 모든 경우의 수를 다 해보는 것이다. 알고리즘을 풀 때 가장 확실한 방법이지만 그만큼 가장 시간이 오래걸리는 기법이다.

 

   ex) 4자리 암호를 풀기 위해 0000~9999까지 모두 시도해보는 것 ( 가장 확실하지만, 가장 오래걸린다 )

 

- 해당 기법을 문제해결 알고리즘에 사용 할 때, 2가지 규칙을 적용한다.

1. 사용된 알고리즘이 해당 문제를 해결하기에 적절한가?

2. 효율적으로 작동하는가?

 

대부분의 경우 2번에서 미충족된다.

다양한 문제를 이 기법으로 해결 하기에는 비효율적이라는 것이다.  

따라서 완전탐색 기법을 사용 시 그 문제에 대한 파악이 중요!

 

 

2. 완전탐색 기법의 종류

1) 브루트 포스 (Brute Force)

- for문과 if문을 이용하여 처음부터 끝까지 탐색하는 방법

 

직역하면 '무식한 힘'으로 해석되며, 이 방법만으로는 대회나 코딩테스트 문제를 해결하긴 어려움.

 

2) 비트마스크

- 이진수 표현을 자료구조로 사용 (and, or, xor, shift, not)

 

각각의 원소가 포함되거나, 포함되지 않는 두가지 선택으로 구성되는 경우 유용하게 사용 가능

출처 : https://rebro.kr/59

 비트마스크로 무엇을 할 수 있을까?

- 정수로 집합을 나타낼 수 있다.

    ex) {1, 3, 4, 5, 9} = 570 = 2^1 + 2^3 + 2^4 + 2^5 + 2^9
- 굳이 비트마스크를 쓰는 이유는? 공간적인 이유, 정수 하나로 배열을 대체할 수 있어서

 

 

3) 백트래킹

- 분할정복을 이용한 기법, 해를 찾아가는 도중 해가 될 것같지 않은 경우가 있다면 더 이상 가지 않고 돌아간다.

 

* 재귀함수 설계 시 고려해야 할 아주 중요한 개념 *

   if(sum >= 50) return; 한 줄짜리 코드의 효율성은 엄청나다.

 

4) 재귀함수

- 함수 내에서 함수 자기 자신을 계속해서 호출

 

비트마스크와 마찬가지로 주로 각 원소가 포함되거나, 포함되지 않는 두 가지 선택을 가질 때 이용된다.

 

5) 순열

- 서로 다른 n개의 원소에서 r개의 중복을 허용하지 않고 순서대로 늘어 놓은 수

 

6) DFS(깊이 우선 탐색) & BFS(너비 우선 탐색)

- DFS : 최대한 깊이 내려간 뒤, 더이상 깊이 갈 곳이 없을 경우 옆으로 이동 (스택 또는 재귀함수로 구현)

  1) 모든 노드를 방문하고자 하는 경우 이 방법 선택

  2) 깊이 우선 탐색이 너비 우선탐색보다 더 간단함

  3) 검색 속도 자체는 너비 우선 탐색에 비해 느림

출처: https://developer-mac.tistory.com/64

 

 

- BFS : 최대한 넓게 이동한 다음, 더 이상 갈 수 없을 때 아래로 이동(큐를 이용해 구현)

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

   2) 주로 두 노드 사이의 최단 경로를 찾고 싶을 때 이 방법 선택

출처: https://developer-mac.tistory.com/64

 

 

 

3. 완전탐색 기법 사용방향

1) 문제에서 가능한 경우의 수를 대략적으로 계산

2) 가능한 방법 다 고려 (위의 6가지 방법)

3) 실제로 답을 구할 수 있는지 생각

'Algorytm > 기초' 카테고리의 다른 글

[Algorythm-기초] 그리디  (0) 2022.12.06
[Algorythm-자료구조] 해시  (0) 2022.12.03
[Alhgorythm-개념] 정렬  (0) 2022.12.01
[Algorythm-개념] 동적 계획법  (1) 2021.09.28