Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1062. ๊ฐ€๋ฅด์นจ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1062. ๊ฐ€๋ฅด์นจ

bba_dda 2021. 8. 10. 19:05
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://www.acmicpc.net/problem/1062

 

1062๋ฒˆ: ๊ฐ€๋ฅด์นจ

์ฒซ์งธ ์ค„์— ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜ N๊ณผ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , K๋Š” 26๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๋‚จ๊ทน ์–ธ์–ด์˜ ๋‹จ์–ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ์–ด๋Š” ์˜์–ด ์†Œ๋ฌธ

www.acmicpc.net

๋‚จ๊ทน์— ์‚ฌ๋Š” ๊น€์ง€๋ฏผ ์„ ์ƒ๋‹˜์€ ํ•™์ƒ๋“ค์ด ๋˜๋„๋ก์ด๋ฉด ๋งŽ์€ ๋‹จ์–ด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ตฌ์˜จ๋‚œํ™”๋กœ ์ธํ•ด ์–ผ์Œ์ด ๋…น์•„์„œ ๊ณง ํ•™๊ต๊ฐ€ ๋ฌด๋„ˆ์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊น€์ง€๋ฏผ์€ K๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฅด์น  ์‹œ๊ฐ„ ๋ฐ–์— ์—†๋‹ค. ๊น€์ง€๋ฏผ์ด ๊ฐ€๋ฅด์น˜๊ณ  ๋‚œ ํ›„์—๋Š”, ํ•™์ƒ๋“ค์€ ๊ทธ K๊ฐœ์˜ ๊ธ€์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋‹จ์–ด๋งŒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. ๊น€์ง€๋ฏผ์€ ์–ด๋–ค K๊ฐœ์˜ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฅด์ณ์•ผ ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š”์ง€ ๊ณ ๋ฏผ์— ๋น ์กŒ๋‹ค.

๋‚จ๊ทน์–ธ์–ด์˜ ๋ชจ๋“  ๋‹จ์–ด๋Š” "anta"๋กœ ์‹œ์ž‘๋˜๊ณ , "tica"๋กœ ๋๋‚œ๋‹ค. ๋‚จ๊ทน์–ธ์–ด์— ๋‹จ์–ด๋Š” N๊ฐœ ๋ฐ–์— ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ํ•™์ƒ๋“ค์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ’€์ด

๋ชจ๋“  ๋‹จ์–ด์— ๊ณตํ†ต๋˜๋Š” anta, tica๋ถ€๋ถ„์„ ์ž๋ฅด๊ณ , ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ 5๊ฐœ๋Š” ํ•ญ์ƒ ์•Œ๊ณ ์žˆ๋‹ค๊ณ  ์„ค์ •ํ•œ ๋’ค, 

DFS๋ฅผ ์ด์šฉํ•ด์„œ k๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ์„ ๋ฝ‘๋Š”๋‹ค (์กฐํ•ฉ)

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

์ตœ์ข…์ ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด์˜ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค. 

 

๋น„ํŠธ๋งต์„ ์“ฐ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์€ ๋ฌธ์ œ์ด๊ธด ํ•œ๋ฐ, ์•ŒํŒŒ๋ฒณ bool ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ๋„ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋น„ํŠธ๋งต์„ ์ด์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ค„์–ด๋“ค๊ฒ ์ง€..?

์ฝ”๋“œ

#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>

using namespace std;

int N, K, max_count;
bool alphabet[26];
vector<string> words;

int canReadNum() {
	bool isCanRead;
	int count = 0;
	for (int i = 0; i < words.size(); i++){
		isCanRead = true;
		string str = words[i];
		for (int j = 0; j < str.length(); j++){
			if (alphabet[str[j] - 'a'] == false){
				isCanRead = false;
				break;
			}
		}

		if (isCanRead == true){
			count++;
		}
	}
	return count;
}

void DFS_combi(int index, int count){
	if (count == K){ // k๊ฐœ ๋‹ค๋ฝ‘์œผ๋ฉด ํ•ด๋‹น ์กฐํ•ฉ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹จ์–ด ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
        int temp_count = canReadNum();
		max_count = max(max_count, temp_count);
		return;
	}

	for (int i = index; i < 26; i++){
		if (alphabet[i] == true) continue;
		alphabet[i] = true;
		DFS_combi(i, count + 1);
		alphabet[i] = false;
	}
}

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

	cin >> N >> K;
	if (K < 5) {
		cout << 0 << endl;
		return 0;
	}
	K -= 5; // a,n,t,i,c 5๊ฐœ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ๊ณ ์žˆ์Œ
	for (int n = 0;n < N;n++) {
		string input;
		cin >> input;
		input = input.substr(4, input.size() - 8); //๋ชจ๋“  ๋‹จ์–ด์— ๊ณตํ†ต๋˜๋Š” ๋ถ€๋ถ„ ์ œ๊ฑฐ
		words.push_back(input);
	}
    // a,n,t,i,c 5๊ฐœ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•Œ๊ณ ์žˆ์Œ
	alphabet['a' - 'a'] = true;
	alphabet['n' - 'a'] = true;
	alphabet['t' - 'a'] = true;
	alphabet['i' - 'a'] = true;
	alphabet['c' - 'a'] = true;

	DFS_combi(0, 0);
	cout << max_count << endl;
	return 0;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•