HyeLog

๋ฐฑ์ค€_1062_๊ฐ€๋ฅด์นจ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

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

shj718 2022. 5. 12. 16:27

๐Ÿ“๋ฌธ์ œ: 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;
}