๋ฐฑ์ค€/C++

[๋ฐฑ์ค€/C++] 16457๋ฒˆ ๋‹จํ’์žŽ ์ด์•ผ๊ธฐ

yulee_to 2022. 8. 12. 21:01

๋ฐฑ์ค€

 


๐Ÿค”๋ฌธ์ œ ์ดํ•ด

๊ฐ ํ€˜์ŠคํŠธ๋‹น ํ•„์š”ํ•œ ์Šคํ‚ฌ์„ ๋‹ค ์‚ฌ์šฉ๊ฐ€๋Šฅํ•  ๋•Œ ๊ทธ ํ€˜์ŠคํŠธ๋ฅผ ๊นฐ ์ˆ˜ ์žˆ๋‹ค. 2n๊ฐœ์˜ ์Šคํ‚ฌ ์ค‘ n๊ฐœ๋งŒ ๊ณจ๋ž์„ ๋•Œ ์ตœ๋Œ€๋กœ ๋งŽ์ด ๊นฐ ์ˆ˜ ์žˆ๋Š” ํ€˜์ŠคํŠธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

์กฐ๊ฑด
ํ‚ค์˜ ๊ฐœ์ˆ˜ : n
ํ€˜์ŠคํŠธ์˜ ๊ฐœ์ˆ˜ : m (1 ~ 100)
ํ€˜์ŠคํŠธ ๋‹น ์Šคํ‚ฌ ์ˆ˜ : k (1 ~ n)
์Šคํ‚ฌ์˜ ๋ฒˆํ˜ธ ( 1~2n)

๐Ÿ”ฅํ’€์ด๐Ÿ”ฅ

2n๊ฐœ์˜ ์Šคํ‚ฌ ์ค‘ ๋ฐฐ์น˜ํ•  ์Šคํ‚ฌ n๊ฐœ๋ฅผ ๊ณจ๋ž์„ ๋•Œ ๊นฐ ์ˆ˜ ์žˆ๋Š” ํ€˜์ŠคํŠธ์˜ ๊ฐœ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ฒŒ ํ–ˆ๋‹ค.

 

๋ณ€์ˆ˜

- quest[i] : i๋ฒˆ์งธ ํ€˜์ŠคํŠธ์—์„œ ํ•„์š”ํ•œ ์Šคํ‚ฌ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋น„ํŠธ๋กœ ํ‘œํ˜„

 

์žฌ๊ท€ํ•จ์ˆ˜ void Solve(int i, int d, int cnt) 

- ํ˜„์žฌ ์ƒํƒœ : ํ˜„์žฌ๊นŒ์ง€ ์ •ํ•œ ์Šคํ‚ฌ์„ ๋น„ํŠธ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” i, ๋ช‡๋ฒˆ์งธ ์Šคํ‚ฌ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•ด์คฌ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” d, ์ •ํ•œ ์Šคํ‚ฌ์˜ ๊ฐœ์ˆ˜ cnt

- ๋‹ค์Œ ์ƒํƒœ : d๋ฒˆ ์Šคํ‚ฌ์„ ์‚ฌ์šฉ or d๋ฒˆ ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

- ์ง„์ž… ์ƒํƒœ : ์•„๋ฌด๊ฒƒ๋„ ์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ด๊ณ  1๋ฒˆ ์Šคํ‚ฌ๋ถ€ํ„ฐ ๊ณจ๋ผ์•ผ ํ•˜๋ฏ€๋กœ Solve(0, 1, 0)

- ์ข…๋ฃŒ ์ƒํƒœ : cnt๊ฐ€ n์ผ ๋•Œ, ์ฆ‰ n๊ฐœ์˜ ์Šคํ‚ฌ์„ ๊ณจ๋ž์„ ๋•Œ return

- d๋ฒˆ ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด i์— ํ•ด๋‹น ์Šคํ‚ฌ ๋ฒˆํ˜ธ์˜ ๋น„ํŠธ๋ฅผ ์ผœ์คŒ(1๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค)

 

ํ•จ์ˆ˜ void CountQuest(int x) 

- ๊ฐ ํ€˜์ŠคํŠธ์—์„œ ํ•„์š”ํ•œ ์Šคํ‚ฌ์˜ ์ •๋ณด์™€ ์ •ํ•œ n๊ฐœ์˜ ์Šคํ‚ฌ์„ AND ์—ฐ์‚ฐํ•œ ๊ฐ’์ด ํ•„์š”ํ•œ ์Šคํ‚ฌ์˜ ์ •๋ณด์™€ ์ผ์น˜ํ•˜๋‹ค๋ฉด ๊นฐ ์ˆ˜ ์žˆ๋Š” ํ€˜์ŠคํŠธ์˜ ์ˆ˜๋ฅผ +1

- ๋ชจ๋“  ํ€˜์ŠคํŠธ์™€ ๋น„๊ต ํ›„ ์ถœ๋ ฅํ•  ๋ณ€์ˆ˜ ans์™€ ๋น„๊ตํ•ด ๋” ํฐ ๊ฐ’์„ ans์— ์ €์žฅ

 

โœ๏ธ ํ›„๊ธฐ

๋ฌธ์ œ์˜ ์ž…๋ ฅ์ด ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ค๋Š”์ง€ ์ œ๋Œ€๋กœ ํ™•์ธํ•˜์ง€ ์•Š์•„์„œ 3๋ฒˆ์ด๋‚˜ ํ‹€๋ ธ๋‹ค.


#include <iostream>
#include <vector>

using namespace std;

int n, m, k, a;
int quest[102];
int ans;

void CountQuest(int x) {
    int cnt = 0;
    for (int i = 0; i < m; i++) {
        if ((quest[i] & x) == quest[i]) {
            cnt++;
        }
    }
    ans = max(ans, cnt);
}


void Solve(int i, int d, int cnt) {
    if (cnt == n) {
        CountQuest(i);
        return;
    } else if (d == 2 * n + 1) return;
    else {
        Solve(i, d + 1, cnt);
        i = i | (1 << d);
        Solve(i, d + 1, cnt + 1);
    }
}


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

    cin >> n >> m >> k;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < k; j++) {
            cin >> a;
            quest[i] = quest[i] | (1 << a);
        }
    }
    Solve(0, 1, 0);

    cout << ans;
}
728x90