HyeLog
๋ฐฑ์ค_1062_๊ฐ๋ฅด์นจ ๋ณธ๋ฌธ
๐๋ฌธ์ : https://www.acmicpc.net/problem/1062
1062๋ฒ: ๊ฐ๋ฅด์นจ
์ฒซ์งธ ์ค์ ๋จ์ด์ ๊ฐ์ N๊ณผ K๊ฐ ์ฃผ์ด์ง๋ค. N์ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๊ณ , K๋ 26๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ๋๋ 0์ด๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๋จ๊ทน ์ธ์ด์ ๋จ์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋จ์ด๋ ์์ด ์๋ฌธ
www.acmicpc.net
๐์๊ณ ๋ฆฌ์ฆ: ๋ธ๋ฃจํธํฌ์ค-๋นํธ๋ง์คํฌ (+๋ธ๋ฃจํธํฌ์ค-์ฌ๊ท)
๐์๊ฐ ๋ณต์ก๋:
1. ์ฒซ ์ ๊ทผ๋ฒ)
26๊ฐ์ ์ํ๋ฒณ ์ค K๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์์(=2์ 26์น) * N๊ฐ์ ๋จ์ด * ๊ฐ ๋จ์ด์์ ๋จ์ด์ ๊ธธ์ด(๋ฌธ์ L๊ฐ)๋งํผ ๋ฐฐ์ด ๋ฌธ์์ธ์ง ๊ฒ์ฌ
→ 2์ 26์น * N * L (N ์ต๋: 50, L ์ต๋: 15) ๐ ์๊ฐ ์ด๊ณผ
2. ๋ฌธ์ ์ ์กฐ๊ฑด(๋ชจ๋ ๋จ์ด์ anta, tica๊ฐ ๋ค์ด๊ฐ) ๊ณ ๋ คํด์ ๊ฐ์ ํ ์ ๊ทผ๋ฒ)
a,n,t,i,c๋ ๋ฌด์กฐ๊ฑด ๋ฐฐ์์ผ ๋จ์ด๋ฅผ 1๊ฐ๋ผ๋ ์ฝ์ ์ ์์ → (26-5)๊ฐ์ ์ํ๋ฒณ ์ค (K-5)๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์์
→ 2์ (26-5)์น * N * L (N ์ต๋: 50, L ์ต๋: 15) = ๋๋ต 200๋ง * 50 * 15 = ์ฝ 15์ต ๐ ์๊ฐ ์ด๊ณผ
3. ๋นํธ๋ง์คํฌ๋ฅผ ์ด์ฉํด์ ๊ฐ์ ํ ์ ๊ทผ๋ฒ)
โ 26๊ฐ์ ์ํ๋ฒณ ์ค K๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ์์(=2์ 26์น)
โ N๊ฐ์ ๋จ์ด
โ ๊ฐ ๋จ์ด์์ ๋จ์ด์ ๊ธธ์ด(๋ฌธ์ L๊ฐ)๋งํผ ๋ฐฐ์ด ๋ฌธ์์ธ์ง ๊ฒ์ฌ
์ด ์ธ๊ฐ์ง ์ค, โ์ โ๋ ์ค์ผ ์ ์์ผ๋ฏ๋ก โ๋ฅผ ๋นํธ๋ง์คํฌ๋ฅผ ์ด์ฉํด์ ์ค์ธ๋ค. โ๋ ์ฌ๊ท๋ก ํผ๋ค.
→ ๋นํธ๋ง์คํฌ์ ์๊ฐ๋ณต์ก๋๋ O(1)์ด๋ค. → 2์ (26-5)์น * N ๐ ๊ฐ๋ฅ
๐์์ด๋์ด:
โ ๋จ์ด๋ฅผ ์ ์ฅํ ๋ i๋ฒ์งธ ์ํ๋ฒณ์ด ๋จ์ด์ ํฌํจ๋๋ฉด, ์ค๋ฅธ์ชฝ์์ i๋ฒ์งธ์ธ ๋นํธ๋ฅผ 1๋ก ์ ์ฅ.
Ex.) a,b,c,d๊ฐ ์ํ๋ฒณ์ ์ ๋ถ์ผ ๋, ๋จ์ด๊ฐ aadda ๋ผ๋ฉด, 1001 ์ ์ฅ.
โก ๋ฐฐ์ฐ๋ ๋ฌธ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก i๋ฒ์งธ ์ํ๋ฒณ์ ๋ฐฐ์ฐ๋ฉด i๋ฒ์งธ ๋นํธ๋ฅผ 1๋ก ์ ์ฅ.
→ โ ์ W, โก๋ฅผ L์ด๋ผ ํ์. ๋จ์ด์๋ ์๋๋ฐ ๋ฐฐ์ด ๋ฌธ์์๋ ์์ผ๋ฉด ๊ทธ ๋จ์ด๋ ์ฝ์ง ๋ชปํ๋ค. ์ฆ, W์ ํน์ ๋นํธ๊ฐ 1์ธ๋ฐ L์ ํน์ ๋นํธ๊ฐ 0์ด๋ผ๋ฉด ๊ทธ ๋จ์ด๋ ์ฝ์ง ๋ชปํ๋ค. ์ด ๋ง์, W์ ํน์ ๋นํธ๊ฐ 1์ธ๋ฐ ~L์ ๋นํธ๊ฐ 1์ด์ด์ ๋์ AND ์ฐ์ฐํ ๊ฒฐ๊ณผ๊ฐ 1์ด๋ผ๋ฉด ๊ทธ ๋จ์ด๋ฅผ ์ฝ์ง ๋ชปํ๋ค๋ ๋ง์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด๋ผ๋ฉด, ๊ทธ ๋จ์ด๋ ์ฝ์ ์ ์๋ค๋ ๋ป์ด๋ค.
๐~L (๋นํธ์ NOT ์ฐ์ฐ) ํ ๋ ์ฃผ์ํ ์ :
intํ ์ฌ์ฉ์ ์ ์ฅ๋๋ ๊ฐ์ 32๋นํธ ์ด๋ฏ๋ก 0000···1001์ ๋ฐ์ ์ํค๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒฐ๊ณผ์ธ ๋ค์ 1001๋ง ๋ฐ์ ๋๋๊ฒ์ด ์๋๋ผ, ์๋ 1111···์ด ๋๋ค. ๋ฐ๋ผ์, NOT ์ฐ์ฐ์ ํ๋๊ฒ ์๋๋ผ, (1<<4) - 1 = 1111์์ 1001์ ๋นผ๋ ์ฐ์ฐ์ ํ๋ฉด ๋ค์ 1001๋ง ๋ฐ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๐์ฝ๋:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int count(int learn, vector<int>& word) { // ์ฝ์ ์ ์๋ ๋จ์ด ๊ฐ์ ์ธ๊ธฐ
int cnt = 0;
int size = word.size();
for (int i = 0; i < size; i++) {
if ((word[i] & ((1 << 26) - 1 - learn)) == 0) {
cnt++;
}
}
return cnt;
}
int solve(int index, int k, int learn, vector<int> &word) {
// ์คํจํ ๊ฒฝ์ฐ
if (k < 0) {
return 0;
}
// ์ฑ๊ณตํ ๊ฒฝ์ฐ
if (index == 26) {
return count(learn, word);
}
// ๋ค์ ํธ์ถ
int ans = 0;
// index๋ฒ์งธ ์ํ๋ฒณ์ ๋ฐฐ์
int tmp = solve(index + 1, k - 1, learn | (1 << index), word);
if (ans < tmp) {
ans = tmp;
}
// index๋ฒ์งธ ์ํ๋ฒณ์ ์๋ฐฐ์
if (index != 'a' - 'a' && index != 'n' - 'a' && index != 't' - 'a' && index != 'i' - 'a' && index != 'c' - 'a') { // a,n,t,i,c ๋ ๋ฌด์กฐ๊ฑด ๋ฐฐ์์ผํ๋ฏ๋ก
tmp = solve(index + 1, k, learn, word);
if (ans < tmp) {
ans = tmp;
}
}
return ans;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, K;
cin >> N >> K;
vector<int> word(N); // ๋จ์ด ์์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ๋จ์ด์ ํฌํจ๋ ์ํ๋ฒณ์ ๋นํธ๋ก ์ ์ฅ
for (int i = 0; i < N; i++) {
string s;
cin >> s;
for (char x : s) {
word[i] |= (1 << (x - 'a'));
}
}
cout << solve(0, K, 0, word) << '\n';
return 0;
}
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค_2003_์๋ค์ ํฉ2 (0) | 2022.05.26 |
---|---|
๋ฐฑ์ค_12100_2048 (Easy) (0) | 2022.05.26 |
๋ฐฑ์ค_14225_๋ถ๋ถ์์ด์ ํฉ (0) | 2022.05.11 |
๋ฐฑ์ค_14889_์คํํธ์ ๋งํฌ(๋ธ๋ฃจํธํฌ์ค-์์ด) (0) | 2022.05.10 |
๋ฐฑ์ค_14888_์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (๋ธ๋ฃจํธํฌ์ค-์์ด) (0) | 2022.05.10 |