λ°±μ€€/C++

[λ°±μ€€/C++] 1043번 거짓말

yulee_to 2022. 7. 26. 19:05

λ°±μ€€

 


πŸ€”λ¬Έμ œ 이해

진싀을 μ•Œκ³  μžˆλŠ” μ‚¬λžŒλ“€μ΄ νŒŒν‹°μ— μ°Έμ„ν•˜λŠ” 경우 κ·Έ νŒŒν‹°μ—μ„  μ§„μ‹€λ§Œ λ§ν•΄μ•Όν•˜κ³ , μˆœμ„œ 상관없이 진싀을 ν•œλ²ˆμ΄λΌλ„ λ“£κ²Œ λ˜λŠ” μ‚¬λžŒλ“€μ΄ μ°Έμ„ν•˜λŠ” νŒŒν‹°λŠ” μ§„μ‹€λ§Œ 말해야 ν•  λ•Œ κ³Όμž₯된 이야기λ₯Ό ν•  수 μžˆλŠ” νŒŒν‹°μ˜ 개수λ₯Ό κ΅¬ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ΄λ‹€.


πŸ’‘μ²«λ²ˆμ§Έ 아이디어

진싀을 μ•„λŠ” μ‚¬λžŒμ΄ ν¬ν•¨λœ νŒŒν‹°μ— κ°„ μ‚¬λžŒλ“€μ„ λͺ¨λ‘ 진싀을 μ•Œκ³  μžˆλ‹€κ³  μ²˜λ¦¬ν•΄μ£Όκ³  이 과정을 λ°˜λ³΅ν•˜λ©΄ μ§„μ‹€λ‘œ 말해야 ν•˜λŠ” νŒŒν‹°μ™€ κ³Όμž₯ν•΄μ„œ 말해도 λ˜λŠ” νŒŒν‹°λ₯Ό ꡬ뢄해쀄 수 μžˆλ‹€κ³  μƒκ°ν–ˆλ‹€.

 

πŸ”₯풀이πŸ”₯

know[i] : i번 μ‚¬λžŒμ΄ 진싀을 μ•Œλ©΄ true, λͺ¨λ₯΄λ©΄ false

party_know[i] : i번 νŒŒν‹°κ°€ 진싀을 말해야 ν•˜λŠ” νŒŒν‹°λ©΄ true, κ³Όμž₯ν•΄μ„œ 말해도 λ˜λŠ” νŒŒν‹°λ©΄ false

party[i][j] : i번째 νŒŒν‹°μ— μ°Έμ„ν•œ μ‚¬λžŒλ“€μ˜ 번호λ₯Ό μ €μž₯

 

처음 진싀을 μ•Œκ³  μžˆλŠ” μ‚¬λžŒλ“€μ΄ μ°Έμ—¬ν•˜λŠ” νŒŒν‹°λ₯Ό true둜 λ°”κΏ”μ€€λ‹€.

진싀을 말해야 ν•˜λŠ” νŒŒν‹°μ—μ„œ 진싀을 λͺ¨λ₯΄λŠ” μ‚¬λžŒλ“€μ„ 진싀을 μ•Œκ³  μžˆλ‹€κ³  μ²˜λ¦¬ν•΄μ£Όκ³ , 진싀을 μ•Œκ²Œλœ μ‚¬λžŒλ“€μ΄ ν¬ν•¨λœ νŒŒν‹°λ“€μ„ 진싀을 말해야 ν•˜λŠ” νŒŒν‹°λ‘œ μ²˜λ¦¬ν•΄μ€€λ‹€.

μƒˆλ‘­κ²Œ 진싀을 μ•Œκ²Œλ˜λŠ” μ‚¬λžŒμ΄ 생기지 μ•Šμ„ λ•ŒκΉŒμ§€ μœ„ 과정을 λ°˜λ³΅ν•΄μ£Όκ³  party_know의 값이 false인 κ²ƒμ˜ 개수λ₯Ό μ„Έμ„œ 좜λ ₯ν•΄μ€€λ‹€.


#include <iostream>
#include <vector>

using namespace std;

int n, m;
vector<vector<int>> party;
bool party_know[52];
bool know[52];

bool solve() {
    int flag = 0;
    for (int i = 0; i < m; i++) {
        if (party_know[i]) {
            for (int x: party[i]) {
                if (know[x]) continue;
                know[x] = true;
                flag = 1;
            }
        }
    }

    for (int i = 0; i < m; i++) {
        if (party_know[i]) continue;
        for (int x: party[i]) {
            if (know[x]) {
                party_know[i] = true;
            }
        }
    }
    return flag;
}

int main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> n >> m;
    party.resize(m + 2);

    int a, b;
    cin >> a;
    for (int i = 0; i < a; i++) {
        cin >> b;
        know[b] = true;
    }

    for (int i = 0; i < m; i++) {
        cin >> a;
        for (int j = 0; j < a; j++) {
            cin >> b;
            party[i].push_back(b);
            if (know[b]) {
                party_know[i] = true;
            }
        }
    }
    int flag = 0;
    for (int i = 0; i < m; i++) {
        if (party_know[i]) {
            for (int x: party[i]) {
                know[x] = true;
                flag = 1;
            }
        }
    }

    for (int i = 0; i < m; i++) {
        if (party_know[i]) continue;
        for (int x: party[i]) {
            if (know[x]) {
                party_know[i] = true;
                flag = 1;
            }
        }
    }
    while (flag) {
        flag = solve();
    }

    int cnt = 0;
    for (int i = 0; i < m; i++) {
        if (!party_know[i])cnt++;
    }
    cout << cnt;
}
728x90