https://www.acmicpc.net/problem/9996
//틀린 코드
#include <bits/stdc++.h>
using namespace std;
int n;
string pat, file;
int main(){
cin >> n;
cin >> pat;
for (int i = 0; i < n; i++) {
cin >> file;
for (int i = 0; i < size.file())
if (file[0] == pat[0] && file[file.length()-1] == pat[pat.length()-1])
cout << "DA\n";
else
cout << "NE\n";
}
return 0;
}
처음엔 코드를 위와 같이 짰다. '실버 문젠데 쉽네?' 하면서 ..머쓱.
패턴이 알파벳 소문자 하나와 *
으로 이뤄져있는 것으로 착각했다.
패턴은 알파벳 소문자 여러 개와 별표(*) 하나로 이뤄진 문자열이다.
소문자는 여러개로 이뤄질 수 있다. ab*cde
같이!
별표를 중심으로 문자열을 분리해야 한다.
별표의 위치를 찾아서, 문자를 분리한다.
힌트를 얻고 다시 풀어보았다.
//틀린 코드(런타임에러)
#include <bits/stdc++.h>
using namespace std;
int n;
string pat, file;
string pat_l, pat_r;
int main(){
cin >> n;
cin >> pat;
int pos = pat.find("*");
pat_l = pat.substr(0, pos);
pat_r = pat.substr(pos+1);
for (int i = 0; i < n; i++) {
cin >> file;
if (pat_l == file.substr(0, pat_l.size()) && pat_r == file.substr(file.size() - pat_r.size())) cout << "DA\n";
else cout << "NE\n";
}
return 0;
}
이렇게 했는데 런타임에러(Out of range)가 발생했다...하아
이유를 모르겠다. 어디서 범위 초과한다는겨.
➡️ 풀이강의를 듣다가 반례 알게 됨.
만약 ab*ab
의 패턴일 때
ab
를 입력하면 정답이라고 뜬다.
접두사+접미사 더한 사이즈보다 입력 값의 사이즈가 같거나 커야된다.
개선된 코드가 아래 있다.
#include <bits/stdc++.h>
using namespace std;
int n;
string pat, file;
string pat_l, pat_r;
int main(){
cin >> n;
cin >> pat;
int pos = pat.find("*");
pat_l = pat.substr(0, pos);
pat_r = pat.substr(pos+1);
for (int i = 0; i < n; i++) {
cin >> file;
if (pat_l.size() + pat_r.size() > file.size()){
cout << "NE\n";
} else {
if (pat_l == file.substr(0, pat_l.size()) && pat_r == file.substr(file.size() - pat_r.size())) cout << "DA\n";
else cout << "NE\n";
}
}
return 0;
}