[๋ฐฑ์ค c++] 1062 ๊ฐ๋ฅด์นจ (๊ณจ4)
๐ ๋ฌธ์
ํญ์ ๋ฌธ์ ์์ ์ ๋งคํ๊ฒ ์ค๋ช ํ๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ๋ณด๋ฉด ์ข ๋ ๋ช ํํ๊ฒ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๋ฏ ํ๋ค.
๋ง์ ๋จ์ด๋ฅผ ์ฝ์ ์ ์๋๋กํ๋, ์ํ๋ฒณ K๊ฐ์ ๊ธ์๋ฅผ ๊ฐ๋ฅด์ณ ์ด๋ ์ฝ์ ์ ์๋ ๋จ์ด์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์๋ค.
๋ฌธ์์ด ๋ค๋ฃจ๊ธฐ + ๋ฐฑํธ๋ํน + brute force์๋ค.
์กฐ๊ฑด 1) ์ํ๋ฒณ ๋ช ๊ฐ๋ฅผ ๊ฐ๋ฅด์น ๊ฒ์ธ๊ฐ?
๋จผ์ "anta" ~ "tica"๋ ๋ฌด์กฐ๊ฑด ์ฝ์ ์ ์์ด์ผ ๋ชจ๋ ๋จ์ด๋ฅผ ์ฝ์ ์ ์๋ ๊ธฐํ(?)๊ฐ ์ฃผ์ด์ง๊ธฐ ๋๋ฌธ์,
"atinc"๋ ๋ฌด์กฐ๊ฑด ์ฝ์ด์ผํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก, ์ํ๋ฒณ์ ์ ํํ๋ ๋ฐฐ์ด์ "atinc"๋ ๋ํดํธ๋ก ์ ํํ ์ ์๋๋ก ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด, ์ฒ์ ์์ํ ๋๋ถํฐ 5๊ฐ์ ์ํ๋ฒณ์ ์ ํํ๊ณ ์์ํด์ผํ๋ค.
๊ทธ๋ง์, ์ํ๋ฒณ ๋ฐฐ์ฐ๋ ๊ฐ์์ธ K๊ฐ๊ฐ 5๊ฐ๋ณด๋ค ์ ์ผ๋ฉด ์ ์ด์ ์๋ฌด๋ฐ ๋จ์ด๋ฅผ ๋ฐฐ์ธ ์ ์๋ค๋ ๋ป.
๊ทธ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค.
์ํ๋ฒณ์ ์ ํํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ฐฑํธ๋ํน ํจ์์ธ chooseRecursive(int least, int alphaIdx)๋ฅผ ํ์ฉํ๋ค.
๋ณดํต ๋ฐฑํธ๋ํน์ ๊ตฌํํ ๋, stack ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํด์ ๊ตฌํํ๋ค.
๊ทผ๋ฐ, ์ ํ์ ํด์ผํ๋ ๊ฒฝ์ฐ์ ๋ช ๊ฐ์ ๋จ์ด๋ฅผ ์ฝ์ ์ ์๋์ง ํ์ธํด์ผํ๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์
์์ ์ ๋ถํ ํ ์ ์๋๋ก ํจ์๋ก ๋ง๋๋ ๊ฒ์ด ์ข๊ฒ ๋ค ์ถ์ด ์ฌ๊ทํจ์๋ก ํ์๋ค...
๊ฐ๋ ์๊ฐ์ด๊ณผ๋ก ์ธํด ์ฌ๊ท ํจ์๋ก ๋ฐฑํธ๋ํน ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์
์ฌ๊ท๋ณด๋ค๋ ์ผ๋จ stack, queue ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํด์ ๊ตฌํํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ํธ์ด๋ค. ํ์ง๋ง ์ฌ๊ทํจ์๊ฐ ์๋ฌด๋๋ ์ง๊ด์ ์ด๊ณ ๊ตฌํํ๊ธฐ ์ฝ๊ธดํ๋ค...
์กฐ๊ฑด2) ๋ฐฐ์ด ์ํ๋ฒณ์ผ๋ก ๋ช ๊ฐ์ ๋จ์ด๋ฅผ ์ฝ์ ์ ์๋๊ฐ?
๊ฐ ๋จ์ด ๋ณ๋ก ์ํ๋ฒณ์ ํ์ธํ์ฌ ๋ช ๊ฐ์ ๋จ์ด๋ฅผ ์ฝ์ ์ ์๋์ง ๋ง๊ทธ๋๋ก ํ๋์ฉ ํ์ธํ๊ณ ์ต๋๊ฐ์ธ์ง ํ์ธํ๋ ํจ์์ด๋ค
brute force.
๐ป ์ ๋ต ์ฝ๋
#include <iostream>
using namespace std;
string words[50];
int N, K;
int learnMax;
bool alphaCheck[26];
void countLearnWords(){
int wordCnt = 0;
//N๊ฐ์ ์ํ๋ฒณ์์ ๊ณ์ฐ
for(int i = 0; i < N; i++){
int canRead = true;
//์, ๋ค ์ํ๋ฒณ ์ ์ธ ์ค๊ฐ์ํ๋ฒณ์ ์ฝ์ ์ ์๋ ์ง ์ฌ๋ถ ํ์ธํ๊ธฐ
for(int j = 4; j < words[i].size() - 4; j++){
int alphaNum = (int)(words[i][j] - 'a');
if(alphaCheck[alphaNum] == false){
canRead = false;
break;
}
}
//์ฝ์ ์ ์๋ ๋จ์ด๋ผ๋ฉด, ์ถ๊ฐ
if(canRead == true) wordCnt++;
}
//์ต๋์ธ์ง ํ์ธ
if(wordCnt > learnMax) learnMax = wordCnt;
}
void chooseRecursive(int least, int alphaIdx){
//๋์ด์ ๋จ์ ์ํ๋ฒณ์ด ์์ ๊ฒฝ์ฐ + ๋ค ์ ํ์, ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ์ด๋ค ํ์ธํ๊ธฐ
if(alphaIdx > 25 || least == 0){
countLearnWords();
return;
}
//1. ํด๋น ์ํ๋ฒณ์ด ์ด๋ฏธ ์ ํ๋์ด ์์ ๊ฒฝ์ฐ, skip (true์ผ ๊ฒฝ์ฐ)
if(alphaCheck[alphaIdx]){
chooseRecursive(least, alphaIdx + 1);
return;
}
//2. ํด๋น ์ํ๋ฒณ์ด ์ ํ๋์ง ์์์ ๊ฒฝ์ฐ,
//ํด๋น ์ํ๋ฒณ ์ ํํ๊ณ ๊ฒฝ์ฐ์ ์ ํ์
alphaCheck[alphaIdx] = true;
chooseRecursive(least -1, alphaIdx + 1);
//ํด๋น ์ํ๋ฒณ ์ ํํ์ง ์๊ณ ๊ฒฝ์ฐ์ ์ ํ์
alphaCheck[alphaIdx] = false;
chooseRecursive(least, alphaIdx + 1);
}
int main(){
//N : ๋จ์ด ๊ฐ์, K : ๋ฐฐ์ธ ์ ์๋ ๊ธ์ ์
cin >> N >> K;
//๋จ์ด๋ค์ ์
๋ ฅ
for(int i = 0; i < N; i++){
cin >> words[i];
}
//anti ~ tica์์ atinc ์ํ๋ฒณ ๋๋จธ์ง ํ์ธ
if( K < 5) { cout << 0 << endl; return 0; }
//a c i n t ์ํ๋ฒณ ๋ฐฉ๋ฌธ check
alphaCheck[0] = true; alphaCheck[2] = true; alphaCheck[8] =true; alphaCheck[13] = true; alphaCheck[19] = true;
//๊ณจ๋ผ์ผ ํ ์ํ๋ฒณ ์ต๋๊ฐ
//์ฌ๊ท + ๋ฐฑํธ๋ํน
chooseRecursive(K-5, 1);
cout << learnMax << endl;
return 0;
}
โฑ ๊ฒฐ๊ณผ
[๋๋์ ]
๊ณจ๋ ์ด์์ ๋ฌธ์ ๋ ํ์คํ ๋ฉ๋๋ฆฌ๊ณ ๊ทธ๋ฅ ํ ๋ฌธ์ ๊ฐ ์๋๊ณ
๋ถํ ์ ๋ณต ๊ฐ๋ ์ผ๋ก ํด๊ฒฐํด์ผํ๋ ์กฐ๊ฑด๋๋ก ํจ์๋ฅผ ๋ง๋๋๊ฒ ์ํธํ ๋ฏ ํ๋ค...
๊ณจ๋ ๋ฌธ์ ํ๋ ํธ๋ ๋ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ๋ค. ์ฐ์ต์ด ๋ง์ด ํ์ํ๋ค.