ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 완전 탐색(Brute Force - with. 백준 일곱난쟁이)
    알고리즘/탐색 2023. 2. 19. 18:07
    728x90

     

     

     

    알고리즘 문제를 해결하기 위해 가장 쉬운 방법 중 하나로 완전 탐색을 떠올릴 수 있다. 이 알고리즘은 간단하게 모든 경우의 수를 탐색하는 방법으로 구현하기 쉬운만큼 시간은 최대로 사용하게 된다. 

     

    완전 탐색으로 풀 수 있는 문제 중 백준의 일곱 난쟁이 문제의 코드를 예시로 들어보겠다.

     

    https://www.acmicpc.net/problem/2309

     

    2309번: 일곱 난쟁이

    아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

    www.acmicpc.net

     

    문제를 간략하게 설명하자면 아홉 난쟁이의 키가 주어졌을 때 일곱 난쟁이의 키의 합이 100이 되는 경우를 찾아 각 난쟁이의 키를 오름차순으로 출력하는 문제이다. 이때 완전 탐색으로 풀 수 있다는 전제 조건은 입력의 범위를 확인하면 파악할 수 있다. 입력이 최대 9명이고 그 중 2명을 제외한 7명을 뽑는 경우의 수 이므로 9C2 = 36가지를 생각할 수 있다. 

     

     

    이 경우 중첩 반복문으로 모든 경우를 탐색할 수 있다.  다음 코드를 확인해보면 완전 탐색이 적용된 것을 확인할 수 있다.

     

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main() {
    	int arr[9], sum = 0;
    	for(int i = 0; i<9; i++) {
    		cin>>arr[i];
    		sum += arr[i];
    	}
    
    	sort(arr, arr+9);
        	for(int i = 0; i<8; i++) {
        		for(int j = 1; j<9; j++) {
        			if(i!=j && sum - arr[i] - arr[j] == 100) {
        				for(int k = 0; k<9; k++) {
        					if(k == i || k == j) continue;
    						cout<<arr[k]<<"\n";
    					}
    					return 0; 
    				}
    			}
        	
    		} 
    }

     

    9명의 난쟁이 키를 입력받은 뒤 오름차순 정렬하여 중복을 제외하고 9명 중 7명을 뽑아 100이 되었을 때 순차적으로 출력하는 코드임을 알 수 있다. 참고로 c++ STL의 sort 알고리즘 시간 복잡도는 O(nlogn) 이므로 문제를 푸는 데에는 영향이 없다. 위의 조건문이 성립할 때 최악의 경우 시간복잡도가 O(n^3) 이 나오더라도 문제의 입력 범위를 비교해보면 충분히 해결할 수 있는 문제이기에 완전 탐색이 적용될 수 있는 것이다. 

     

    어떤 문제이든 처음으로 떠올리는 방법이 모든 경우의 수를 탐색하는 방법인데 굉장히 쉬운만큼 실제 코딩테스트나 대회에서도 완전 탐색으로 풀리는 문제가 많이 나오지는 않는다. 그러나 반대로 알고리즘 중 가장 기본적인 방법이면서도 완전탐색으로 풀리는 문제가 일부 존재하기에 이해하고 넘어가는 게 좋다고 생각한다.

     

     

    728x90

    '알고리즘 > 탐색' 카테고리의 다른 글

    합집합 찾기(Union-Find)  (0) 2021.12.25
    이분 탐색(binary search)  (0) 2021.12.25
    깊이 우선 탐색(DFS)  (0) 2021.12.25
    너비 우선 탐색(BFS)  (0) 2021.12.25

    댓글

Designed by Tistory.