Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 1043번 - 거짓말

dkswnkk 2022. 9. 28. 15:51

문제

 

1043번: 거짓말

μ§€λ―Όμ΄λŠ” νŒŒν‹°μ— κ°€μ„œ 이야기 ν•˜λŠ” 것을 μ’‹μ•„ν•œλ‹€. νŒŒν‹°μ— 갈 λ•Œλ§ˆλ‹€, μ§€λ―Όμ΄λŠ” 지민이가 κ°€μž₯ μ’‹μ•„ν•˜λŠ” 이야기λ₯Ό ν•œλ‹€. μ§€λ―Όμ΄λŠ” κ·Έ 이야기λ₯Ό 말할 λ•Œ, μžˆλŠ” κ·ΈλŒ€λ‘œ μ§„μ‹€λ‘œ λ§ν•˜κ±°λ‚˜ μ—„μ²­λ‚˜κ²Œ

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>
using namespace std;

int parent[101];
int N, M;

void union_parent(vector<vector<int>> &party){
    for(int i=0; i<party.size(); i++){
        bool flag = false;
        for(int k=0; k<party[i].size(); k++){
            if(parent[party[i][k]] == -1){
                flag = true;
                break;
            }
        }
        if(flag){
            for(int k=0; k<party[i].size(); k++){
                parent[party[i][k]] = -1;
            }
        }
    }
    for(int i=party.size()-1; i>=0; i--){
        bool flag = false;
        for(int k=0; k<party[i].size(); k++){
            if(parent[party[i][k]] == -1){
                flag = true;
                break;
            }
        }
        if(flag){
            for(int k=0; k<party[i].size(); k++){
                parent[party[i][k]] = -1;
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>N>>M;
    int know; cin>>know;
    for(int i=0; i<know; i++){
        int peo; cin>>peo;
        parent[peo] = -1;
    }
    
    vector<vector<int>> party;
    
    for(int i=0; i<M; i++){
        int cnt; cin>>cnt;
        vector<int> temp;
        for(int k=0; k<cnt; k++){
            int peo; cin>>peo;
            temp.push_back(peo);
        }
        party.push_back(temp);
    }
    
    int cnt = 50;
    while(cnt--) union_parent(party);

    int ans = 0;
    for(int i=0; i<party.size(); i++){
        bool flag = true;
        for(int k=0; k<party[i].size(); k++){
            if(parent[party[i][k]] == -1){
                flag = false;
                break;
            }
        }
        if(flag) ans ++;
    }
    
    cout<<ans;
}

 

풀이

문제 λΆ„λ₯˜λŠ” μœ λ‹ˆμ˜¨ νŒŒμΈλ“œμ΄μ§€λ§Œ μž…λ ₯값이 50밖에 λ“€μ–΄μ˜€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 브루트포슀λ₯Ό μ΄μš©ν•΄μ„œ κ΅¬ν˜„μœΌλ‘œ ν’€μ—ˆμŠ΅λ‹ˆλ‹€.

진싀을 μ•„λŠ” μ‚¬λžŒμ˜ 경우 parent[μ‚¬λžŒ] = -1둜 μ„ΈνŒ…ν•΄μ£Όκ³ , λͺ¨λ“  νŒŒν‹°λ₯Ό νƒμƒ‰ν•˜λ©΄μ„œ 진싀을 μ•„λŠ” μ‚¬λžŒμ΄ ν•΄λ‹Ή νŒŒν‹°μ— μ‘΄μž¬ν•˜λŠ” 경우 κ·Έ νŒŒν‹°μ— μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  μ‚¬λžŒμ„ 진싀을 μ•„λŠ” μ‚¬λžŒμœΌλ‘œ μ„ΈνŒ…ν–ˆμŠ΅λ‹ˆλ‹€.

input:
4 5
1 1
1 1
1 2
1 3
2 4 2
2 4 1
answer: 1

λ‹€λ§Œ μœ„μ™€ 같은 μž…λ ₯처럼 νŒŒν‹°μ˜ μˆœμ„œμ— μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— νŒŒν‹° 탐색을 μ•žμ—μ„œ λ„λŠ” κ²½μš°μ™€ λ’€μ—μ„œ λ„λŠ” 경우둜 μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

input:
6 5
1 6
2 4 5
2 1 2
2 2 3
2 3 4
2 5 6
answer: 0

λ˜ν•œ νŒŒν‹° 탐색을 μ•ž λ’€λ‘œ 총 ν•œ 번만 ν•˜λŠ” 경우 μœ„μ™€ 같은 μž…λ ₯μ—μ„œ μ‚¬λžŒ 2, 3이 κ°±μ‹ λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— νŒŒν‹°μ˜ 총 갯수인 50만큼 λ°˜λ³΅ν•˜λ„λ‘ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.