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
๋์ ๋ต
์๊ฐ์ ํ๋ฆ
-
๋ฌธ์์ด ๋น๊ต์ธ๋ฐ, *์ ?๋ ์ด๋ป๊ฒ ๋น๊ตํ๋ฉด ์ข์๊น?
*๋ ์๋ฌด ๋ฌธ์๋ ์์ด๋ ๋๊ณ ์ฌ๋ฌ ๊ฐ์ ์๋ฌด ๋ฌธ์๋ ์๋ ๋๋ค.
?๋ ํ๋์ ์๋ฌด ๋ฌธ์๋ ์๋ ๋๋ค.
-
*๋ ๋ค์ ๋ฌธ์๊ฐ ์ค๋ ๊ฒฝ์ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์์ง๋ค.
ex_) *d ์์ add๊ฐ ์ฃผ์ด์ก์ผ๋ฉด d๊ฐ 2๋ฒ์งธ d์ผ์๋ 3๋ฒ์งธ d์ผ์๋ ์๋ค.
-
์์ผ๋ ์นด๋ ๋ฌธ์์ด์ ๋๋ฉด์ ํด๋น ์์ผ๋ ์นด๋์ ํด๋นํ๋ ๋ฌธ์๊ฐ ์ฃผ์ด์ง ๋จ์ด์ ์กด์ฌํ๋์ง๋ฅผ ๊ฒ์ฌํ์.
- *, ? , ๋ฌธ์ ์ ๊ฒฝ์ฐ๋ฅผ ์กฐ๊ฑด์ ์ฃผ์ด์ ๋๋๋ฉด ๋๋ค.
- ์ด ๋, *๊ฐ ์์ ๊ฒฝ์ฐ ๊ทธ ๋ค์ ๋ฌธ์๊ฐ ์ค๋ฉด 2์ ex์ ๊ฐ์ด ํด๋นํ๋ ๋ฌธ์์ ๋ํด ๋ชจ๋ ์คํํด์ผํจ์ ๋ฐ๋ก ๊ตฌํํด์ฃผ์.
- ํ์ฌ ์ด๋ ์์น๋ฅผ ๋น๊ตํ๊ณ ์๋์ง๋ฅผ ์ฝ๊ฒ ๋ํ๋ด๊ธฐ ์ํด ์์ผ๋ ์นด๋ ๋ฌธ์์ด์ 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;
}
}
}
๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฐํ ๋ฐฉ์์ ๊ฐ์๋ฐ, ๋ณธ์ธ์ *๋ค์ ๋ฌธ์๊ฐ ์์ ๋์ ์์์ ๋๋ก ๋๋์ด ํด๋น ๋จ์ด์์ ๋ฌธ์์ ์กด์ฌ ๊ฐฏ์๋งํผ ์ฌ๊ท๋ฅผ ๋๋ ธ๋ค.
์ ๋ต์์๋ *๊ฐ ์์ ๋ ๋ฐ๋ก ์ฌ๊ทํจ์๋ฅผ ๋์์์ผ ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํ์๋ค. ๋ํ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ์ฌ์ฉํ์๋ค. ๊ธฐ์กด ์ฝ๋์์๋ ์ ์ค๋ฅ๊ฐ ๋ฌ์๊น? ๋ฐ๋ก๋ฅผ ์์ง ์ฐพ์ง ๋ชปํ๋ค. (๋ฐ๋ก๊ฐ ์๋ค๋ฉด ๋๊ธ ๋ถํ..)
Comment