[๋ฐฑ์ค€] [C++] ๐Ÿ‘จโ€๐Ÿซ ๊ฐ€๋ฅด์นจ 1062๋ฒˆ

๐Ÿ’ก ๋ฌธ์ œ ์„ค๋ช…

๋ฐฑ์ค€ ๊ฐ€๋ฅด์นจ

๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•˜์—ฌ๋„ ํ’€๋ฆฌ์ง€๋งŒ, ๋น„ํŠธ๋งˆ์Šคํ‚น ์—ฐ์Šต์„ ์œ„ํ•ด ๋น„ํŠธ๋งˆ์Šคํ‚น์œผ๋กœ ํ’€์–ด๋ณด๋„๋ก ํ•˜์ž.

๋น„ํŠธ๋งˆ์Šคํ‚น ํ’€์ด๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น๋ณด๋‹ค ์•ฝ 10๋ฐฐ ๋น ๋ฅด๋‹ค.

๋‹จ, ๋น„ํŠธ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์‹์€ ์žˆ์–ด์•ผ ์ฝ”๋“œ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ’ก 2์ง„์ˆ˜ ํ‘œ๊ธฐ

์ˆซ์ž ์•ž์— โ€œ0bโ€ ๋ฅผ ๋ถ™์ธ๋‹ค.

int a = 0b101;  // a = 5 (1*4 + 0*2 + 1*1)
cout << a << endl;  // 5 ์ถœ๋ ฅ

๐Ÿ’ก 2์ง„์ˆ˜๋กœ ์ถœ๋ ฅ

ํ—ค๋”ํŒŒ์ผ : #include

bitset<๋น„ํŠธ์˜ ๊ฐœ์ˆ˜="">(์ถœ๋ ฅํ•  ๋ณ€์ˆ˜)๋น„ํŠธ์˜>

int a = 5;
cout << bitset<10>(a) << endl;  // 0000000101 ์ถœ๋ ฅ

๐Ÿ’ก ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ์ด์šฉํ•œ ํ’€์ด

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define MAX

/*
๋น„ํŠธ๋งˆ์Šคํ‚น (๋ฐฑํŠธ๋ž˜ํ‚น์ด ํ•„์š” ์—†์Œ)
K๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฅด์น ๋•Œ, ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜

antic ๋Š” ๋ฌด์กฐ๊ฑด ๋“ค์–ด๊ฐ€์•ผ ํ•จ -> K<5 ๋ผ๋ฉด ๋‹ต์€ 0

๋ฏธ๋ฆฌ ๊ฐ ๋‹จ์–ด์— ๋Œ€ํ•ด ํ•„์š”ํ•œ bit๋ฅผ ๋งŒ๋“ค์–ด๋†“๊ณ , 
ํ™•์ธํ• ๋•Œ ํ˜„์žฌ bit์™€ ๋‹จ์–ด์˜ bit๋ฅผ AND ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด ๋‹จ์–ด์˜ bit์™€ ๊ฐ™๋‹ค๋ฉด 
๊ทธ ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ด๋‹ค.
*/

int N, K;
string words[50];
int wordsBit[50];
int ans;

void dfs(int bit, int level, int last){
    // K๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฅด์ณค๋‹ค๋ฉด
    if (level==K){
        int cnt=0;
        for (int i=0; i<N; i++){
            if ((bit & wordsBit[i]) == wordsBit[i]) cnt++;
        }
        if(cnt==N){  // N๊ฐœ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฐ”๋กœ ์ข…๋ฃŒ
            cout << N;
            exit(0);
        }
        ans = max(ans, cnt);  // ans ์—…๋ฐ์ดํŠธ
    }

    // ์•„์ง ํ™•์ธ ์•ˆํ•œ ๋น„ํŠธ ์ค‘์— ํ˜„์žฌ ์•ˆ์ผœ์ ธ์žˆ๋Š” ๋น„ํŠธ์— ๋Œ€ํ•ด dfs
    for (int i = last+1; i < 26; ++i){
        // i๋ฒˆ ๋น„ํŠธ๊ฐ€ 0์ด๋ผ๋ฉด ์ผœ์ฃผ๊ณ  ์žฌ๊ท€
        if (!(bit & (1 << i)))
            dfs(bit | (1 << i), level + 1, i);
    }
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    
    cin >> N >> K;
    for (int i=0; i<N; i++){
        cin >> words[i];
    }

    // 5๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด ์ ˆ๋Œ€ ๋ชป๋งŒ๋“ค์Œ
    if (K<5) {
        cout << 0;
        exit(0);
    }

    int bit = 0b00000010000010000100000101;  // 2์ง„์ˆ˜๋กœ a, c, i, n, t ์ผœ์คŒ

    // ๋ฏธ๋ฆฌ ๊ฐ ๋‹จ์–ด์— ๋Œ€ํ•ด ํ•„์š”ํ•œ bit๋ฅผ ๋งŒ๋“ค์–ด๋†“๊ธฐ
    for (int i=0; i<N; i++){
        wordsBit[i] = 0b00000010000010000100000101;
        string word = words[i];
      	
        // ๋ชจ๋“  ๋‹จ์–ด๋Š” "anta"๋กœ ์‹œ์ž‘๋˜๊ณ , "tica"๋กœ ๋๋‚˜๋‹ˆ๊นŒ ๊ทธ ์‚ฌ์ด๋งŒ
        for (int j=4; j<word.length()-4; j++){
            wordsBit[i] |= 1 << (word[j]-'a');  // ์•ŒํŒŒ๋ฒณ์— ๋งž๋Š” ๋น„ํŠธ๋ฅผ ์ผœ์ฃผ๊ธฐ
        }
        // cout << bitset<26>(wordsBit[i]) << '\n';  // ๊ฐ ๋ฌธ์ž์˜ ๋น„ํŠธ๊ฐ€ ์ž˜ ๋๋Š”์ง€ ํ™•์ธ
    }
    
    // ์ด๋ฏธ 5๊ฐœ์˜ ๊ธ€์ž๋Š” ๊ฐ€๋ฅด์ณค์œผ๋‹ˆ ์ง„ํ–‰๋„๋Š” 5๋กœ ์‹œ์ž‘, -1์€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฒดํฌํ•œ ๋น„ํŠธ์˜ ์ธ๋ฑ์Šค
    dfs(bit, 5, -1);

    cout << ans;
    
    return 0;
}

๐Ÿ’ก ์ œ์ถœ ๊ฒฐ๊ณผ

20ms ๋Œ€์˜ ๋น ๋ฅธ ์†๋„๋กœ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์†๋„


๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌ

๋น„ํŠธ ๋ฌธ์ œ๋ฅผ ๋ช‡๊ฐœ ํ’€๋‹ค ๋ณด๋‹ˆ ๋น„ํŠธ ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ข€ ์ƒ๊ฒผ๋‹ค.

๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ํž˜๋“ ๋ฐ, 0b์™€ bitset<>์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๊ฐ„์— ๊ฐ’์„ ์ฒดํฌํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.