Algorithm🐰/λ°±μ€€

[λ°±μ€€] 2309 일곱 λ‚œμŸμ΄ backtracking

Jouureee 2021. 4. 6. 03:05

문제 :

www.acmicpc.net/problem/2309

 

2309번: 일곱 λ‚œμŸμ΄

아홉 개의 쀄에 걸쳐 λ‚œμŸμ΄λ“€μ˜ ν‚€κ°€ 주어진닀. μ£Όμ–΄μ§€λŠ” ν‚€λŠ” 100을 λ„˜μ§€ μ•ŠλŠ” μžμ—°μˆ˜μ΄λ©°, 아홉 λ‚œμŸμ΄μ˜ ν‚€λŠ” λͺ¨λ‘ λ‹€λ₯΄λ©°, κ°€λŠ₯ν•œ 정닡이 μ—¬λŸ¬ 가지인 κ²½μš°μ—λŠ” μ•„λ¬΄κ±°λ‚˜ 좜λ ₯ν•œλ‹€.

www.acmicpc.net

 

뢄석 :

λΈŒλ‘ μ¦ˆμ˜€μŒμ—λ„ μ–΄λ €μ› λ‹€.. μ•žμœΌλ‘œ 브루트 포슀, λ°±νŠΈλž˜ν‚Ήμͺ½μ„ μ’€ 더 곡뢀해 보아야겠닀.

μ’…λ§ŒλΆμ—μ„œ λ³΄μ•˜λ˜ 아이디어λ₯Ό 가지고 문제 접근을 ν•˜μ˜€λ‹€.

각 λ‚œμŸμ΄λ“€μ€ 100을 ν¬ν•¨ν•˜λŠ”λ° μ†ν•˜κ±°λ‚˜ μ•ˆ μ†ν•˜κ±°λ‚˜ λ‘˜μ€‘ ν•˜λ‚˜μ΄λ‹€. κ·ΈλŸ¬λ―€λ‘œ λͺ¨λ“  λ‚œμŸμ΄λ“€μ„ νƒμƒ‰ν•˜λŠ”λ° return 문을 λ§Œλ‚˜ μž¬κ·€κ°€ λλ‚˜κ²Œ 되면 visitλ₯Ό false둜 ν•΄ μ†ν•˜μ§€ μ•Šκ²Œλ” λ§Œλ“€κ³  λ‹€λ₯Έ μ›μ†Œλ“€μ„ νƒμƒ‰ν•˜λŠ” 것이닀. 

μ΄λ ‡κ²Œ ν•˜μ—¬ μ†ν•˜λŠ” μ›μ†Œλ“€λ§Œμ„ μ •λ ¬ν•΄ 좜λ ₯ν•œλ‹€.

 

C++ μ½”λ“œ :

//
//  2309_dwarf7.cpp
//  SOMAπŸ‘©πŸ»‍πŸ’»
//
//  Created by JoSoJeong on 2021/04/06.
//

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


using namespace std;
vector<int>arr;
vector<int>re_arr;

int visit[100];
int cnt = 0;

void brute_dwarf7(int score, int cnt){
    if (score == 100 and cnt == 7){
        sort(re_arr.begin(), re_arr.end());
        
        for(int i = 0; i < 7; i++){
            cout << re_arr.at(i) << "\n";
        }
        exit(0);
    }
    
    if (cnt > 7 || score > 100){
        return;
    }
    
    for(int i= 0; i <9; i++){
        if(visit[arr[i]] == false){
            visit[arr[i]] = true;
            re_arr.push_back(arr[i]);
            brute_dwarf7(score + arr[i], cnt + 1);
            visit[arr[i]] = false;
            re_arr.pop_back();
        }
    }
    return;

}

int main(){
    memset(visit, false, sizeof(visit));
    for(int i =0; i < 9; i++){
        int temp;
        cin >> temp;
        arr.push_back(temp);
    }
    brute_dwarf7(0, 0);
    
    return 0;
}