본문 바로가기
백준

백준 9996 한국이 그리울 땐 서버에 접속하지

by 콩순이냉장고 2021. 7. 23.

문제 URL : https://www.acmicpc.net/problem/9996

 

9996번: 한국이 그리울 땐 서버에 접속하지

총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.

www.acmicpc.net

문제접근법 : 

 

작년에 이문제를 풀었던군요 그때는 정규표현식을 이용해서 풀진 않았지만 둘다 소스코드를 올려드릴게요

정규표현식 공부중이기때문에 C++ regex를 이용해서 풀었습니다. 정규표현식 간단한 문법을 물어보는

문제니 따로 공부하시면 바로 풀수있습니다.

 

정규표현식 소스

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
#include <bits/stdc++.h>
 
using namespace std;
vector<string> v;
int n;
string s;
void input() {
    cin >> n;
    v.resize(n);
    cin >> s;
    for (int i = 0; i < n; i++)
        cin >> v[i];
}
 
 
void solve() {
    s.replace(s.find('*'), 1"\\w*");
    for (int i = 0; i < n; i++) {
        cout << (regex_match(v[i],regex(s))?"DA":"NE"<< "\n";
    }
 
}
 
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    //freopen("input.txt", "r", stdin);
    input();
    solve();
        
}
 
 
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
#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
    int n;
    cin>>n;
    string p,f,l;
    string s[101];
    cin>>p;
    int middle=p.find('*');
    f=p.substr(0,middle);
    l=p.substr(middle+1);
    
    for(int i=0;i<n;i++)
    {
        cin>>s[i];
        int fnum=0;
        int lnum=0;
        for(int k=0;k<middle;k++)
        {
            if(s[i][k]==f[k])
                fnum++;
        }
        int j=s[i].size()-1;
        for(int k=l.size()-1;k>=0;k--)
        {
            if(l[k]==s[i][j--])
                lnum++;
        }
        if(p.size()-1<=s[i].size()&&lnum==l.size()&&fnum==f.size())
            cout<<"DA"<<endl;
        else
            cout<<"NE"<<endl;
 
 
    }
    
 
 
}
 
cs

 

 

사실 완전구현에서 푼것이 작년에 푼거라서 어떻게 풀었는지 기억도 안납니다 소스코드를 보니 *를 기준으로 왼쪽과 오른쪽을 잘라서 풀었는데 메모리적으로나 스피드도 좀더 빠르더군요 첫번째꺼 소스 몇번 더 제출해보니 8ms나오고 그런거보니 regex가 그리 빠르지 않는것같은 느낌이 듭니다. 그치만 너무 편하다는건 정말 큰 메리트인것같네요

 

궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.

 

 

'백준' 카테고리의 다른 글

백준 1013 Contact  (0) 2021.07.23
백준 3447 버그왕  (0) 2021.07.23
백준 1916 최소비용 구하기  (0) 2021.07.23
백준 14426 접두사 찾기  (0) 2021.07.16
백준 12904 A와 B  (0) 2021.07.15