[c++] BOJ 1062 :: ๊ฐ€๋ฅด์นจ

๋ฌธ์ œ

๊ฐ€๋ฅด์นจ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

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

 

ํ’€์ด

  • brute force๋กœ ์ฐพ๊ธฐ (N์ด ์ž‘์Œ)
  • ์กฐ๊ฑด๋“ค์„ ์ด์šฉํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ์‹œ๊ฐ„๋ณต์žก๋„ ์ค„์ด๊ธฐ

 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<string> words;
bool visited[26]; // bit ์“ธ ๋ฐ๊ฐ€ ์ด๊ฑฐ๋ฐ–์—..
int N, K;
int result = 0;

void getMaxWord(int c ,int count) {
    if (count == K) {
        int tmpResult = 0;
        for (int i = 0; i < words.size(); i++) {
            bool flag = true;
            for (int j = 0; j < words[i].length(); j++) { // ์‚ฌ์šฉ ์‹œ ์—ฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, length๋Š” ์ตœ๋Œ€ 15
                if (!visited[words[i][j] - 'a']) {
                    flag = false;
                    break;
                }
            }
            if (flag)
                tmpResult++;
        }
        result = max(tmpResult, result);
        return;
    }

    for (int i = c; i < 26; i++) {
        if (!visited[i]) {
            visited[i] = true;
            getMaxWord(i, count + 1);
            visited[i] = false;
        }
    }
}

int main() {
    cin >> N >> K;
    // anta, tica => a n t i c (5)
    // a(0) c(2) i(8) n(13) t(19) 

    for (int i = 0; i < N; i++) {
        string str; cin >> str;
        string midWord;
        midWord.assign(str.begin() + 4, str.end() - 4);
        words.push_back(midWord);
    }

    if (K < 5) {
        cout << 0;
        return 0;
    }
    if (K >= 26) {
        cout << N;
        return 0;
    }

    K -= 5;

    visited[0] = true;
    visited[2] = true;
    visited[8] = true;
    visited[13] = true;
    visited[19] = true;

    getMaxWord(0, 0);
    cout << result << '\n';
}

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2024 140 1165

๊ทผ๋ฐ ๋‚˜ bitmap ์•ˆ์ผ๋Š”๋””..

bitmap ์‚ฌ์šฉํ•˜๋ฉด visited ๋ฐฐ์—ด์„ bit๋กœ ๋งŒ๋“ค์–ด์„œ ์—ฐ์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธ€์ž ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ๋น„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ ์•ŒํŒŒ๋ฒณ ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•