문제 URL : https://www.acmicpc.net/problem/9996
문제접근법 :
작년에 이문제를 풀었던군요 그때는 정규표현식을 이용해서 풀진 않았지만 둘다 소스코드를 올려드릴게요
정규표현식 공부중이기때문에 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 |