๐Ÿ’œ๊ฐœ๋ฐœ๊ณผ ์ผ์ƒ (โ‰ง∇โ‰ฆ)๏พ‰

[๋ฐฑ์ค€ c++] 1062 ๊ฐ€๋ฅด์นจ (๊ณจ4) ๋ณธ๋ฌธ

CS/๋ฐฑ์ค€

[๋ฐฑ์ค€ c++] 1062 ๊ฐ€๋ฅด์นจ (๊ณจ4)

๊ฐ•์˜์„œ 2023. 9. 17. 17:07

๐Ÿ“Œ ๋ฌธ์ œ

ํ•ญ์ƒ ๋ฌธ์ œ์—์„œ ์• ๋งคํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋“ฏ ํ•˜๋‹ค.

๋งŽ์€ ๋‹จ์–ด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋กํ•˜๋˜, ์•ŒํŒŒ๋ฒณ 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;
}

 

โฑ ๊ฒฐ๊ณผ

 

[๋Š๋‚€์ ]

๊ณจ๋“œ ์ด์ƒ์˜ ๋ฌธ์ œ๋Š” ํ™•์‹คํžˆ ๋ฉ๋•Œ๋ฆฌ๊ณ  ๊ทธ๋ƒฅ ํ’€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๊ณ 

๋ถ„ํ• ์ •๋ณต ๊ฐœ๋…์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ์กฐ๊ฑด๋Œ€๋กœ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š”๊ฒŒ ์†ํŽธํ•œ ๋“ฏ ํ•˜๋‹ค...

 

๊ณจ๋“œ ๋ฌธ์ œ ํ•˜๋‚˜ ํ‘ธ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค. ์—ฐ์Šต์ด ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค.