2309

백준 2309번

Link: 2309번: 일곱 난쟁이


문제 설명

평범하게 모든 경우를 따져가며 조건 맞으면 출력해주는 DFS 문제였다.

9개 중 7개를 뽑아 합이 100이 될때 리턴해주면 되는 문제다.

요즘 DFS를 활용한 완전탐색 문제를 많이 접하는 것 같다.

이건 그중에서도 기초적인 문제인듯 하다.

분명 방학 시작 전까지는 이런 쉬운 문제도 쩔쩔매며 어떻게 풀지 고민했을 것 같은데, 어느새 아 이거 DFS로 조합 구해서 풀면 되는 문제네 하고 떠오를 수준이 되었다는 점이 마냥 신기하다.

이런식으로 DP도 정복하는 것이 목표이다.


정답 코드

//
// Created by Keith_Lee on 11/02/2019.
//

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int littles[9] = {0, };
bool visit[9] = {false, };
vector<int> intermediate;

void DFS(int index, int count){
    if(index == 9){
        if(count == 7){
            int sum = 0;

            for(int i=0; i<9; i++){
                if(visit[i]){
                    sum += littles[i];
                }
            }

            if(sum == 100){
                for(int i=0; i<9; i++){
                    if(visit[i]){
                        intermediate.push_back(littles[i]);
                    }
                }
            }
        }

        return;
    }

    visit[index] = true;
    DFS(index+1, count+1);
    visit[index] = false;
    DFS(index+1, count);
}

int main(){
    for(int i=0; i<9; i++){
        cin >> littles[i];
    }

    DFS(0, 0);

    vector<int> result;

    for(int i=0; i<7; i++){
        result.push_back(intermediate[i]);
    }

    sort(result.begin(), result.end());

    for(int i=0; i<result.size(); i++){
        cout << result[i] << '\n';
    }

    return 0;
}