[wildcard] 문제
와일드카드 패턴과 함께 파일명의 집합이 주어질 때, 그중 패턴에 대응되는 파일명들을 찾아내는 프로그램을 작성하세요.
먼저 완전탐색 알고리즘으로 문제를 해결하였습니다. algospot 통과됨;;; 88ms
입력 값은 다음과 같습니다
2
he?p
3
help
heap
helpp
*p*
3
help
papa
hello
출력값은 다음과 같습니다.
heap
help
help
papa
전체 코드는 다음과 같습니다.
//
// wildcard.cpp
// AALGGO
//
// Created by inhyeok on 2021/09/14.
//
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin("wildcard.txt");
bool check(const string& wildcard, const string& filename){
int pos = 0;
while(pos < wildcard.size() && pos < filename.size() &&
(wildcard[pos]=='?' || (wildcard[pos] ==filename[pos] ))){
pos ++;
}
if(pos == wildcard.size()){
return pos==filename.size();
}
if (wildcard[pos] == '*'){
for(int i=0; i+pos <= filename.size(); ++i){
if(check(wildcard.substr(pos+1), filename.substr(i+pos)))
return true;
}
}
return false;
}
void wild(string wildcard, vector<string>& filename){
vector<string> result;
for(int i=0; i<filename.size(); i++){
if(check(wildcard, filename[i])){
result.push_back(filename[i]);
}
}
sort(result.begin(), result.end());
for(int i=0; i<result.size(); i++){
cout << result[i] << endl;
}
}
int main(int argc, const char * argv[]) {
int Test_case;
fin >> Test_case;
for (int i=0; i< Test_case ; i++){
string wildcard;
int num;
fin >> wildcard;
fin >> num;
vector<string> filename;
for(int j=0; j<num; j++){
string temp;
fin >> temp;
filename.push_back(temp);
}
wild(wildcard, filename);
}
return 0;
}
메모이제이션 써서 만든거. 4ms WOW
//
// wildcard.cpp
// AALGGO
//
// Created by inhyeok on 2021/09/14.
//
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("wildcard.txt");
string W,F;
int cache[101][101];
bool check(int w, int f){
int &ret = cache[w][f];
if(ret!=-1) return ret;
while(w < W.size() && f < F.size() &&
(W[w]=='?' || (W[w] ==F[f] ))){
w++;
f++;
}
if(w == W.size()){
return ret = (f==F.size());
}
if (W[w] == '*'){
for(int i=0; i+f <= F.size(); i++){
if(check(w+1, i+f))
return ret=1;
}
}
return ret = 0;
}
void wild(string wildcard, vector<string>& filename){
vector<string> result;
W = wildcard;
for(int i=0; i<filename.size(); i++){
memset(cache, -1, sizeof(cache));
F = filename[i];
if(check(0, 0)){
result.push_back(filename[i]);
}
}
sort(result.begin(), result.end());
for(int i=0; i<result.size(); i++){
cout << result[i] << endl;
}
}
int main(int argc, const char * argv[]) {
int Test_case;
fin >> Test_case;
for (int i=0; i< Test_case ; i++){
string wildcard;
int num;
fin >> wildcard;
fin >> num;
vector<string> filename;
for(int j=0; j<num; j++){
string temp;
fin >> temp;
filename.push_back(temp);
}
wild(wildcard, filename);
}
return 0;
}
Comments