완전탐색( Exhaustive search )
'무식하게 푼다(brute-force)'는 컴퓨터의 빠른 계산 능력을 이용해 가능한 경우의 수를 일일이 나열하면서 답을 찾는 방법을 의미. 이렇게 가능한 방법을 전부 만들어 보는 알고리즘을 뜻한다.
- 완전 탐색은 컴퓨터의 빠른 계산 속도를 잘 이용하는 방법이다.
완전 탐색 관련 개념
다음과 같은 개념들이 완전탐색을 통한 문제풀이에 사용되며 문제의 조건과 방식에 따라 적절한 개념을 이용하여 문제 해결 시간을 향상 시킬 수 있다.
1. Brute Force : 가능한 모든 경우에 대해 모두 확인 하여 답을 찾는 방식
2. 비트마스크 : 컴퓨터의 언어인 이진수를 활용하여 정수를 이진수 형태로 표현하여 비트연산을 활용하는 방법
3. 순열 : 서로 다른 개의 원소 n개에서 r(r<=n)개를 뽑아 한 줄로 세우는 경우의 수
4. DFS (Depth-First Search) : 루트 노드에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
-관련 개념) 백트래킹 : 비선형으로 구성된 자료 구조를 깊이 우선으로 탐색할 때, 더 이상 나아갈 수 없는 상황에서 그 이전 단계로 복귀하는 과정
5. BFS (Breadth-First Search) : 탐색트리의 루트노드부터 목표노드를 만날 때까지 단계별로 횡방향으로 탐색을 진행해 나가는 방식
6. 재귀함수 : 함수 내에서 자기 자신을 다시 호출하는 함수 // 자신이 수행할 작업을 유사한 형태의 여러 조각으로 쪼갠 뒤 그 중 한 조각을 수행하고, 나머지를 자기 자신을 호출해 실행하는 함수
완전 탐색과 관련된 백준 의 알고리즘 문제 해결을 통해 완전 탐색에 대해 탐구해보겠다.
1. 2309번 일곱 난쟁이
2309번: 일곱 난쟁이
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
www.acmicpc.net
* 문제 풀이
[BAEKJOON 2309번] (C++) 일곱 난쟁이
최대 9명의 키에 대한 입력이 주어지며 주어지는 키가 100이 넘지 않기 때문에 완전 탐색을 통해 문제를 해결하였다. 일곱 난쟁이의 키의 합이 100이 되도록 주어진 9명의 키중에서 2명의 키를 제��
hroad.tistory.com
2. 3085번 사탕 게임
3085번: 사탕 게임
첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.
www.acmicpc.net
* 문제 풀이
[BAEKJOON 3085번] (C++) 사탕 게임
n의 크기가 최대 50인 정사각형 형태의 배열에 주어진 사탕 중 두개의 사탕의 위치를 바꾸었을 때 행이나 열중에 가장 긴 연속 부분을 찾는 문제이다. 중첩 for문을 통해 배열 내의 모든 경우의 수
hroad.tistory.com
3. 2503번 숫자 야구
2503번: 숫자 야구
첫째 줄에는 민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N이 주어진다. 이어지는 N개의 줄에는 각 줄마다 민혁이가 질문한 세 자리 수와 영수가 답한 스트��
www.acmicpc.net
* 문제풀이
[BAEKJOON 2503번] (C++) 숫자 야구
//백준 2503 숫자야구 #pragma warning(disable:4996) #include #include #include #include #include #include using namespace std; struct inputData { int question; int strike; int ball; }; int n; inputD..
hroad.tistory.com
3. 1182번 부분수열의 합
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
* 문제풀이
[BAEKJOON 1182번] (C++) 부분수열의 합
입력값으로 주어진 전체수열의 모든 부분수열의 합을 완전탐색하여 문제를 해결하였다. 재귀함수를 통해 DFS(tmpSum, idx + 1); //현재 인덱스의 수를 더하지 않은 결과로 다시 진행 DFS(sum, id
hroad.tistory.com
'알고리즘스터디' 카테고리의 다른 글
[알고리즘] 분할정복 (Divide and Conquer) (0) | 2020.09.15 |
---|---|
[알고리즘] 탐욕법 (Greedy Algorithm) (0) | 2020.09.07 |
[알고리즘] 버킷 정렬 (Bucket Sort) (0) | 2020.08.26 |
[알고리즘] 기수 정렬 (Radix Sort) (0) | 2020.08.26 |
[알고리즘] 계수 정렬 (Count Sort) (0) | 2020.08.19 |