Back to Blog List

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

โ†Algorithm

๋ฌธ์ œ ์„ค๋ช…

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

Blog Image

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

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

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


2์ง„์ˆ˜ ํ‘œ๊ธฐ

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

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

2์ง„์ˆ˜๋กœ ์ถœ๋ ฅ

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

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

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

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

cpp
#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 ๋Œ€์˜ ๋น ๋ฅธ ์†๋„๋กœ ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Blog Image

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

Blog Image

๋งˆ๋ฌด๋ฆฌ

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

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