๐Ÿ•๏ธ ICPC Sinchon/Backtracking

[BOJ][C++] ๋ฐฑ์ค€ 1497๋ฒˆ: ๊ธฐํƒ€์ฝ˜์„œํŠธ

์„ ๋‹ฌ 2024. 8. 17. 02:33
๋ฐ˜์‘ํ˜•

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

 

 

๋ฌธ์ œ

๊ฐ•ํ† ๋Š” Day Of Mourning์˜ ๊ธฐํƒ€๋ฆฌ์ŠคํŠธ๋กœ, ๋‹ค๊ฐ€์˜ค๋Š” ๊ณต์—ฐ์„ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋‹ค.

์–ด๋Š ๋‚  ๊ฐ•ํ† ์˜ ์ง‘์— ๋„๋‘‘์ด ๋“ค์–ด์„œ ๊ธฐํƒ€๋ฅผ ๋ชจ๋‘ ๋„๋‘‘๋งž๊ณ  ๋ง์•˜๋‹ค. ๊ธฐํƒ€๋ฅผ ์‚ฌ์•ผ ํ•œ๋‹ค.

๊ฐ•ํ† ๋Š” ๊ณต์—ฐ ๋•Œ ์—ฐ์ฃผํ•  ๋…ธ๋ž˜์˜ ๋ชฉ๋ก์„ ๋ฝ‘์•„ ๋†“์•˜๋‹ค. ํ•˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ๊ธฐํƒ€๋กœ ๋ชจ๋“  ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์–ด๋–ค ๊ธฐํƒ€๋Š” ์–ด๋–ค ๊ณก์„ ์—ฐ์ฃผํ•  ๋•Œ, ์ด์ƒํ•œ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ญ์ƒ ์™„๋ฒฝ์„ ์ถ”๊ตฌํ•˜๋Š” ๊ฐ•ํ† ๋Š” ์ด๋Ÿฐ ์ผ์„ ์šฉ๋‚ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ํ•„์š”ํ•œ ๊ธฐํƒ€์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, GIBSON์œผ๋กœ 1, 2, 3๋ฒˆ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๊ณ , FENDER๋กœ 1, 2, 5๋ฒˆ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๊ณ , EPIPHONE์œผ๋กœ 4, 5๋ฒˆ ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๊ณ , ESP๋กœ 1๋ฒˆ๊ณก์„ ์ œ๋Œ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์„ธ์ค€์ด๋Š” EPIPHONE๊ณผ GIBSON์„ ์‚ฌ๋ฉด ์ตœ์†Œ์˜ ๊ฐœ์ˆ˜๋กœ ๋ชจ๋“  ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ธฐํƒ€์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ณก์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , M์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ธฐํƒ€์˜ ์ด๋ฆ„๊ณผ ๊ธฐํƒ€๊ฐ€ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์˜ ์ •๋ณด๊ฐ€ 1๋ฒˆ ๊ณก๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. Y๋Š” ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๊ณ , N์€ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๊ธฐํƒ€์˜ ์ด๋ฆ„์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ธธ์ด๋Š” 2 ์ด์ƒ, 50 ์ดํ•˜์ด๋‹ค. ๋‘ ๊ธฐํƒ€์˜ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ•„์š”ํ•œ ๊ธฐํƒ€์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์ด ์—†์œผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

์ž…๋ ฅ์„ ์กฐ๊ธˆ ๊นŒ๋‹ค๋กญ๊ฒŒ ์ค˜์„œ ์ž…๋ ฅ ๋ฐ›๋Š” ์ฝ”๋“œ๊ฐ€ ์ข€ ๊ธด ํŽธ์ด๋‹ค

    cin >> n >> m;
    v.assign(n, vector<bool>(m));
    
    for(int i=0; i<n; i++) {
        string name, input;
        cin >> name >> input;
        
        for(int j=0; j<m; j++) {
            v[i][j] = input[j]=='Y';
        }
    }

 

์ด์ œ ๊ฐ ๊ธฐํƒ€๋ฅผ ๋Œ๋ฉด์„œ ํฌํ•จ ์‹œํ‚ค๊ฑฐ๋‚˜ ํฌํ•จ ์‹œํ‚ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋‹ค ์‚ดํŽด๋ณด๋ฉด์„œ

์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ณก์„ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ๊ธฐํƒ€์˜ ๊ฐฏ์ˆ˜๋ฅผ return ํ•˜๋ฉด ๋œ๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น์ด๋‹ค.

 

// ํ’€์ด : https://whkakrkr.tistory.com

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

using namespace std;

typedef pair<int, int> ci;

int n,m;
vector<vector<bool>>v;
vector<ci>ans; // ans{a,b} = a๊ฐœ์˜ ๊ณก์„ b๊ฐœ์˜ ๊ธฐํƒ€๋กœ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค

int getSongNum(vector<bool>&song) {
    int num = 0;
    for(bool b : song) {
        num += b;
    }
    return num;
}

void recur(int k, vector<bool>song, int guitar) {
    // ๋ชจ๋“  ๊ธฐํƒ€๋ฅผ ๋‹ค ํ™•์ธ
    if(k>=n){
        int songNum = getSongNum(song);
        ans.push_back({songNum, guitar});
        return;
    }

    // k๋ฒˆ ๊ธฐํƒ€ ์„ ํƒ ์•ˆํ•จ
    recur(k+1, song, guitar);
    
    // K๋ฒˆ ๊ธฐํƒ€ ์„ ํƒํ•จ
    for(int i=0; i<m; i++) {
        if(v[k][i]) {
            song[i] = true;
        }
    }
    recur(k+1, song, guitar+1);
}

bool cmp(ci a, ci b) {
    if(a.first == b.first) {
        return a.second < b.second;
    }
    return a.first > b.first;
}

int solution() {
    recur(0, vector<bool>(m,false), 0);

    // ๊ณก์˜ ์ˆ˜๊ฐ€ ํฌ๊ณ  ๊ธฐํƒ€์˜ ์ˆ˜๊ฐ€ ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ
    sort(ans.begin(), ans.end(), cmp);

    if(ans[0].first == 0) {
        // ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณก์ด ์—†์Œ
        return -1;
    }
    
    return ans[0].second;
}

int main() {
    // ์ž…๋ ฅ
    cin >> n >> m;
    v.assign(n, vector<bool>(m));
    
    for(int i=0; i<n; i++) {
        string name, input;
        cin >> name >> input;
        
        for(int j=0; j<m; j++) {
            v[i][j] = input[j]=='Y';
        }
    }

    // ํ’€์ด ๋ฐ ์ถœ๋ ฅ
    cout << solution();
    
    return 0;
}

 

 

 

์‹œํ–‰์ฐฉ์˜ค

์˜ˆ์ œ3์„ ์ฃผ์˜ํ•˜์ž.

๋ชจ๋“  ๊ณก์„ ๋‹ค ์—ฐ์ฃผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค (ใ…‹ใ…‹)

๋”๋ณด๊ธฐ

๋•๋ถ„์— ์—ด์‹ฌํžˆ ์ง  ์ฝ”๋“œ ๋˜์ง€๊ณ  ์ƒˆ๋กœ ์งฌ ใ…Ž..ใ…Ž

// ํ’€์ด : https://whkakrkr.tistory.com

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

using namespace std;

int n,m;
vector<vector<bool>>v;
vector<int>ans;

// ๊ณต์—ฐ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€ = ๋ชจ๋“  ๋…ธ๋ž˜๋ฅผ ์—ฐ์ฃผํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€
bool isComplete(vector<bool>&song) {
    for(bool i : song) {
        if(!i) return false;
    }
    return true;
}

void recur(int k, vector<bool>song, int guitar) {
    if(isComplete(song)) { // ๋ชจ๋“  ๋…ธ๋ž˜ ์—ฐ์ฃผ ๊ฐ€๋Šฅ
        ans.push_back(guitar);
        return;
    }
    
    if(k>=n){ // ๋ชจ๋“  ๊ธฐํƒ€๋ฅผ ๋‹ค ํ™•์ธ
        return;
    }

    // k๋ฒˆ ๊ธฐํƒ€ ์„ ํƒ ์•ˆํ•จ
    recur(k+1, song, guitar);
    
    // K๋ฒˆ ๊ธฐํƒ€ ์„ ํƒํ•จ
    for(int i=0; i<m; i++) {
        if(v[k][i]) {
            song[i] = true;
        }
    }
    recur(k+1, song, guitar+1);
}

int solution() {
    recur(0, vector<bool>(m,false), 0);
    
    if(ans.size() == 0) {
        return -1;
    }
    
    sort(ans.begin(), ans.end());
    return ans[0];
}

int main() {
    // ์ž…๋ ฅ
    cin >> n >> m;
    v.assign(n, vector<bool>(m));
    
    for(int i=0; i<n; i++) {
        string name, input;
        cin >> name >> input;
        
        for(int j=0; j<m; j++) {
            v[i][j] = input[j]=='Y';
        }
    }

    // ํ’€์ด ๋ฐ ์ถœ๋ ฅ
    cout << solution();
    
    return 0;
}

 

 

 

๋ฐ˜์‘ํ˜•