본문 바로가기

PS/그 외 다른 사이트

[알고스팟 WILDCARD] 와일드카드 C++

728x90

algospot.com/judge/problem/read/WILDCARD

 

algospot.com :: WILDCARD

Wildcard 문제 정보 문제 와일드카드는 다양한 운영체제에서 파일 이름의 일부만으로 파일 이름을 지정하는 방법이다. 와일드카드 문자열은 일반적인 파일명과 같지만, * 나 ? 와 같은 특수 문자를

algospot.com

너무 어려웠다... 동적프로그래밍 진짜 어려웠던듯

 

풀이법은 한자리씩 대응시켜보고

*를 만나면 *까지 대응되는 문자열을 구하고

그다음부터 또 한개씩 대응시켜보는것

 

처음에 시간초과나서 두번째는 메모이제이션 사용했슴..

 

 

재귀 정말 헷갈려 ㅜ

 

 

시간초과남(풀이x)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
 
bool search(string wildcase, string namecase) {
    int idx = 0;
    //한글자씩 비교과정
    while (idx < wildcase.size() && idx < namecase.size() &&
        (wildcase[idx] == '?' || wildcase[idx] == namecase[idx]))
        idx++;
    //대응이 안되면 왜 안되는지 확인
    //인덱스가 와일드카드 사이즈 범위 넘었을때
    if (idx == wildcase.size()) return idx == namecase.size();
 
    if (wildcase[idx] == '*')
        for (int skip = 0; idx + skip < namecase.size(); skip++)
            if (search(wildcase.substr(idx + 1), namecase.substr(idx + skip)))
                return true;
 
    return false;
 
}
int main() {
    int c, n;
    string w, s;
    cin >> c >> w >> n;
    while (c--) {
        while (n--) {
            cin >> s;
            if (search(w, s) == true)
                cout << s << '\n';
        }
    }
    return 0;
}
cs

 

 

메모이제이션 사용 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
 
 
using namespace std;
int dp[101][101];
string wild, name;
 
int search(int w, int s) {
 
    int result = dp[w][s];
    if (result != -1return result;
    //한글자씩 비교과정
    while (w < wild.size() && s < name.size() &&
        (wild[w] == '?' || wild[w] == name[s])) {
        w++;
        s++;
    }
 
    //대응이 안되면 왜 안되는지 확인
    //인덱스가 와일드카드 사이즈 범위 넘었을때
    if (w == wild.size()) return dp[w][s] = (s == name.size());
 
    if (wild[w] == '*')
        for (int skip = 0; s + skip <= name.size(); skip++)
            if (search(w + 1, s + skip))
                return dp[w][s] = 1;
 
    return dp[w][s] = 0;
 
}
int main() {
    int c, n;
 
    cin >> c;
    while (c--) {
        vector<string> words;
        cin >> wild;
        cin >> n;
 
 
        while (n--) {
            cin >> name;
            memset(dp, -1sizeof(dp));
            if (search(00== 1)
                words.push_back(name);
        }
        sort(words.begin(), words.end());
        for (int i = 0; i < words.size(); i++)
            cout << words[i] << '\n';
    }
    return 0;
}
cs
728x90