[c++] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต 1๊ถŒ :: ์™€์ผ๋“œ์นด๋“œ (๋ฌธ์ œ ID: WILDCARD, ๋‚œ์ด๋„ : ์ค‘)

https://www.algospot.com/judge/problem/read/WILDCARD

๋ฌธ์ œ

์™€์ผ๋“œ์นด๋“œ๋Š” ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์—์„œ ํŒŒ์ผ ์ด๋ฆ„์˜ ์ผ๋ถ€๋งŒ์œผ๋กœ ํŒŒ์ผ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์—ด์€ ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ๋ช…๊ณผ ๊ฐ™์ง€๋งŒ, * ๋‚˜ ? ์™€ ๊ฐ™์€ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•œ๋‹ค.

์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์—ด์„ ์•ž์—์„œ ํ•œ ๊ธ€์ž์”ฉ ํŒŒ์ผ๋ช…๊ณผ ๋น„๊ตํ•ด์„œ, ๋ชจ๋“  ๊ธ€์ž๊ฐ€ ์ผ์น˜ํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์—ด์ด ํŒŒ์ผ๋ช…๊ณผ ๋งค์น˜๋œ๋‹ค๊ณ  ํ•˜์ž. ๋‹จ, ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์—ด์— ํฌํ•จ๋œ ? ๋Š” ์–ด๋–ค ๊ธ€์ž์™€ ๋น„๊ตํ•ด๋„ ์ผ์น˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉฐ, * ๋Š” 0 ๊ธ€์ž ์ด์ƒ์˜ ์–ด๋–ค ๋ฌธ์ž์—ด์—๋„ ์ผ์น˜ํ•œ๋‹ค๊ณ  ๋ณธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์™€์ผ๋“œ ์นด๋“œ he?p ๋Š” ํŒŒ์ผ๋ช… help ์—๋„, heap ์—๋„ ๋งค์น˜๋˜์ง€๋งŒ, helpp ์—๋Š” ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค. ์™€์ผ๋“œ ์นด๋“œ *p* ๋Š” ํŒŒ์ผ๋ช… help ์—๋„, papa ์—๋„ ๋งค์น˜๋˜์ง€๋งŒ, hello ์—๋Š” ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค.

์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์—ด๊ณผ ํ•จ๊ป˜ ํŒŒ์ผ๋ช…์˜ ์ง‘ํ•ฉ์ด ์ฃผ์–ด์งˆ ๋•Œ, ๊ทธ ์ค‘ ๋งค์น˜๋˜๋Š” ํŒŒ์ผ๋ช…๋“ค์„ ์ฐพ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ C (1 <= C <= 10) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ์ค„์—๋Š” ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž์—ด W ๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ํŒŒ์ผ๋ช…์˜ ์ˆ˜ N (1 <= N <= 50) ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ํ›„ N ์ค„์— ํ•˜๋‚˜์”ฉ ๊ฐ ํŒŒ์ผ๋ช…์ด ์ฃผ์–ด์ง„๋‹ค. ํŒŒ์ผ๋ช…์€ ๊ณต๋ฐฑ ์—†์ด ์•ŒํŒŒ๋ฒณ ๋Œ€์†Œ๋ฌธ์ž์™€ ์ˆซ์ž๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์™€์ผ๋“œ์นด๋“œ๋Š” ๊ทธ ์™ธ์— * ์™€ ? ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 100 ์ดํ•˜์ด๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ์ฃผ์–ด์ง„ ์™€์ผ๋“œ์นด๋“œ์— ๋งค์น˜๋˜๋Š” ํŒŒ์ผ๋“ค์˜ ์ด๋ฆ„์„ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์•„์Šคํ‚ค ์ฝ”๋“œ ์ˆœ์„œ(์ˆซ์ž, ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž ์ˆœ)๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ

2
he?p
3
help
heap
helpp
*p*
3
help
papa
hello

์˜ˆ์ œ ์ถœ๋ ฅ

heap
help
help
papa

๋‚˜์˜ ๋‹ต

์ƒ๊ฐ์˜ ํ๋ฆ„
  1. ๋ฌธ์ž์—ด ๋น„๊ต์ธ๋ฐ, *์™€ ?๋Š” ์–ด๋–ป๊ฒŒ ๋น„๊ตํ•˜๋ฉด ์ข‹์„๊นŒ?

    *๋Š” ์•„๋ฌด ๋ฌธ์ž๋„ ์—†์–ด๋„ ๋˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•„๋ฌด ๋ฌธ์ž๋‚˜ ์™€๋„ ๋œ๋‹ค.

    ?๋Š” ํ•˜๋‚˜์˜ ์•„๋ฌด ๋ฌธ์ž๋‚˜ ์™€๋„ ๋œ๋‹ค.

  2. *๋Š” ๋’ค์— ๋ฌธ์ž๊ฐ€ ์˜ค๋Š” ๊ฒฝ์šฐ์— ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง„๋‹ค.

    ex_) *d ์—์„œ add๊ฐ€ ์ฃผ์–ด์กŒ์œผ๋ฉด d๊ฐ€ 2๋ฒˆ์งธ d์ผ์ˆ˜๋„ 3๋ฒˆ์งธ d์ผ์ˆ˜๋„ ์žˆ๋‹ค.

  3. ์™€์ผ๋“œ ์นด๋“œ ๋ฌธ์ž์—ด์„ ๋Œ๋ฉด์„œ ํ•ด๋‹น ์™€์ผ๋“œ ์นด๋“œ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์ฃผ์–ด์ง„ ๋‹จ์–ด์— ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜์ž.

    1. *, ? , ๋ฌธ์ž ์˜ ๊ฒฝ์šฐ๋ฅผ ์กฐ๊ฑด์„ ์ฃผ์–ด์„œ ๋‚˜๋ˆ„๋ฉด ๋œ๋‹ค.
    2. ์ด ๋•Œ, *๊ฐ€ ์™”์„ ๊ฒฝ์šฐ ๊ทธ ๋’ค์— ๋ฌธ์ž๊ฐ€ ์˜ค๋ฉด 2์˜ ex์™€ ๊ฐ™์ด ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์— ๋Œ€ํ•ด ๋ชจ๋‘ ์‹คํ–‰ํ•ด์•ผํ•จ์„ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์ž.
    3. ํ˜„์žฌ ์–ด๋Š ์œ„์น˜๋ฅผ ๋น„๊ตํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์‰ฝ๊ฒŒ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์™€์ผ๋“œ ์นด๋“œ ๋ฌธ์ž์—ด์˜ pointer์™€ ๋‹จ์–ด ๋ฌธ์ž์—ด์˜ pointer๋ฅผ ๋”ฐ๋กœ ๋‘์ž.
์ฝ”๋“œ
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

int index = 0;
int searchOthers = 0;

bool checkMatching(vector<char>& target, string& word, int tp,int wp) {
    int target_pointer = tp; // ํ˜„์žฌ target์˜ ๋ช‡๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌ ์ค‘์ธ์ง€
    int word_pointer = wp; // ํ˜„์žฌ word์˜ ๋ช‡๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌ ์ค‘์ธ์ง€
    int starExist = 0;
    while(target_pointer<target.size()) {
        if (target[target_pointer] == '*') {
            starExist = 1;
            target_pointer++;
            continue;
        }
        else if (target[target_pointer] == '?') {
            word_pointer++; target_pointer++;
            continue;
        }
        else {
            if (starExist) {
                vector<pair<int,int>> word_index;
                for (int j = word_pointer; j < word.size(); j++) {
                    if (target[target_pointer] == word[j])
                        word_index.push_back(make_pair(target_pointer, j));
                }
                for (int k = 0; k < word_index.size(); k++) {
                    if (checkMatching(target, word, word_index[k].first, word_index[k].second))
                        return true;
                }
                return false;
            }
            else {
                if (target[target_pointer] == word[word_pointer]) {
                    word_pointer++; target_pointer++;
                    continue;
                }
                else
                    return false;
            }
        }
    }
    if (target_pointer == target.size() && (starExist||word_pointer==word.size()))
        return true;
    else
        return false;
}

int main() {
    int c;
    cin >> c;
    cin.ignore(256, '\n');

    while (c--) {
        string word_list[50]; // ๋‹จ์–ด ๋ฆฌ์ŠคํŠธ
        string answer_list[50]; // ์ •๋‹ต ๋ฆฌ์ŠคํŠธ
        index = 0;

        string w;
        getline(cin, w);

        vector<char> w_arr;
        for (int i = 0; i < w.size(); i++)
            w_arr.push_back(w[i]); // string => arr

        int n;
        cin >> n;
        cin.ignore(256, '\n');

        for (int i = 0; i < n; i++) {
            getline(cin, word_list[i]); // ๋‹จ์–ด๋ฅผ ๋ฐ›์•„์„œ
            if (checkMatching(w_arr, word_list[i], 0, 0)) // ๋งค์นญ๋˜๋ฉด
                answer_list[index++] = word_list[i]; // ์ •๋‹ต ๋ฐฐ์—ด์— ๋„ฃ๋Š”๋‹ค.
        }

        sort(answer_list,answer_list+index); // ์ •๋‹ต ๋ฐฐ์—ด์„ ์•„์Šคํ‚ค์ฝ”๋“œ ์ˆœ์„œ๋กœ ๋ฐฐ์น˜

        for (int i = 0; i < index; i++) {
            cout << answer_list[i] << " ";
        }
        cout << endl;
    }

}

 ํ•˜๋‚˜์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. ๋งˆ์ง€๋ง‰์— return true๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์ฒ˜์Œ์— *์„ ๋งŒ๋‚˜๊ณ  d๋ฌธ์ž๋ฅผ ๋งŒ๋‚˜์„œ ๋“ค์–ด์™”๋˜ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ return ๋˜๋ฉด์„œ true๋ฅผ mainํ•จ์ˆ˜์—์„œ์˜ ํ˜ธ์ถœ๋ฌธ์œผ๋กœ returnํ•˜๊ฒŒ ๋œ๋‹ค.

 ์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰์— starExist์™€ word๋ฅผ ์ฒดํฌํ•˜๋Š” ์กฐ๊ฑด์„ OR ์—ฐ์‚ฐํ•ด๋‘” ์ด์œ ๋Š” target์˜ ๋งˆ์ง€๋ง‰์ด *๋ผ๋ฉด word๊ฐ€ ๋ช‡ ๊ฐœ ๋” ๋‚˜์˜ฌ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ด์ฆˆ๋ฅผ ๋งž์ถ”์ง€ ๋ชปํ•ด๋„ ์ƒ๊ด€์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 ์˜ˆ๋ฅผ ๋“ค์–ด adeeee๋ผ๋Š” ๋ฌธ์ž๋ฅผ ํ…Œ์ŠคํŠธ ํ–ˆ์„ ๋•Œ์—๋Š” 6๋ฒˆ์งธ ๊ทธ๋ฆผ์—์„œ target_pointer๋ฅผ ์ฆ๊ฐ€์‹œ์ผฐ์œผ๋ฏ€๋กœ while๋ฌธ์„ ๋น ์ ธ๋‚˜์™€์„œ true๋ฅผ returnํ• ๊ฑด์ง€ false๋ฅผ returnํ• ๊ฑด์ง€ ๊ฒ€์‚ฌํ•ด์•ผํ•œ๋‹ค. ์ด ๋•Œ word์—์„œ์˜ ํฌ์ธํ„ฐ๋Š” ์•„์ง 3์ด๋ผ๋Š” index ์œ„์น˜์— ์žˆ๊ณ  word์˜ ๊ธธ์ด๋Š” 6์ด์ง€๋งŒ *์˜ ํŠน์„ฑ์ƒ ๊ธธ์ด๊ฐ€ ์ƒ๊ด€์—†๊ธฐ ๋•Œ๋ฌธ์— true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ •๋‹ต

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

using namespace std;

int idx = 0;
int searchOthers = 0;
int cache[101][101];

bool checkMatching(vector<char>& target, string& word, int tp, int wp) {
    int& ret = cache[tp][wp];
    if (ret != -1) return ret;
     // tp: ํ˜„์žฌ target์˜ ๋ช‡๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌ ์ค‘์ธ์ง€
     // wp: ํ˜„์žฌ word์˜ ๋ช‡๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌ ์ค‘์ธ์ง€
    while (tp<target.size()&&wp<word.size()&&(target[tp]=='?'||target[tp]==word[wp])) {
        // ?์ผ ๋•Œ
        // ๋ฌธ์ž๊ฐ€ ์„œ๋กœ ๊ฐ™์„ ๋•Œ
        // ์•„์ง target๊ณผ word ๋‘˜ ๋‹ค ๋๊นŒ์ง€ ์•ˆ๋ดค์„ ๋•Œ
        tp++; wp++;
    }
    if (tp == target.size())
        return wp == word.size();
    if (target[tp] == '*') {
        for (int i = 0; i <= word.size() - wp; i++) {
            if (checkMatching(target, word, tp+1, wp+i))
                return true;
        }
    }
    return false;
}

int main() {
    int c;
    cin >> c;
    cin.ignore(256, '\n');

    while (c--) {
        string word_list[50]; // ๋‹จ์–ด ๋ฆฌ์ŠคํŠธ
        string answer_list[50]; // ์ •๋‹ต ๋ฆฌ์ŠคํŠธ
        memset(cache, -1, sizeof(cache));
        idx = 0;

        string w;
        getline(cin, w);

        vector<char> w_arr;
        for (int i = 0; i < w.size(); i++)
            w_arr.push_back(w[i]); // string => arr

        int n;
        cin >> n;
        cin.ignore(256, '\n');

        for (int i = 0; i < n; i++) {
            getline(cin, word_list[i]); // ๋‹จ์–ด๋ฅผ ๋ฐ›์•„์„œ
            if (checkMatching(w_arr, word_list[i], 0, 0)) // ๋งค์นญ๋˜๋ฉด
                answer_list[idx++] = word_list[i]; // ์ •๋‹ต ๋ฐฐ์—ด์— ๋„ฃ๋Š”๋‹ค.
        }

        sort(answer_list, answer_list + idx); // ์ •๋‹ต ๋ฐฐ์—ด์„ ์•„์Šคํ‚ค์ฝ”๋“œ ์ˆœ์„œ๋กœ ๋ฐฐ์น˜

        for (int i = 0; i < idx; i++) {
            cout << answer_list[i]<<endl;
        }
    }

}

 ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ๊ฐํ•œ ๋ฐฉ์‹์€ ๊ฐ™์€๋ฐ, ๋ณธ์ธ์€ *๋’ค์— ๋ฌธ์ž๊ฐ€ ์™”์„ ๋•Œ์™€ ์•ˆ์™”์„ ๋•Œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๋‹น ๋‹จ์–ด์—์„œ ๋ฌธ์ž์˜ ์กด์žฌ ๊ฐฏ์ˆ˜๋งŒํผ ์žฌ๊ท€๋ฅผ ๋Œ๋ ธ๋‹ค.

 ์ •๋‹ต์—์„œ๋Š” *๊ฐ€ ์™”์„ ๋•Œ ๋ฐ”๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋™์ž‘์‹œ์ผœ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋˜ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์„๊นŒ? ๋ฐ˜๋ก€๋ฅผ ์•„์ง ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. (๋ฐ˜๋ก€๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ..)

๋ฐ˜์‘ํ˜•