백준 9996번 문제를 풀던 중 예제 입력은 통과하지만 제출 시에 통과가 되지 않는 상황을 맞딱드렸다.
#include<iostream>
#include<string>
using namespace std;
int main() {
int case_cnt = 0;
cin >> case_cnt;
string pattern = "";
cin >> pattern;
string res = "";
for(int i = 0; i < case_cnt; i++) {
string input = "";
cin >> input;
bool is_end = false;
int pattern_idx = 0;
int input_idx = 0;
while(pattern.at(pattern_idx) != '*') {
if(pattern.at(pattern_idx) != input.at(input_idx)) {
is_end = true;
break;
}
pattern_idx++;
input_idx++;
}
if(is_end) {
res += "NE\n";
continue;
}
pattern_idx = pattern.size() - 1;
input_idx = input.size() - 1;
while(pattern.at(pattern_idx) != '*') {
if(pattern.at(pattern_idx) != input.at(input_idx)) {
is_end = true;
break;
}
pattern_idx--;
input_idx--;
}
if(is_end) {
res += "NE\n";
} else {
res += "DA\n";
}
}
cout << res;
return 0;
}
패턴의 앞부터 입력 값의 문자와 일치하는 지 검사 후 뒤에도 검사를 하는 단순한 로직이다.
문제의 원인은 패턴과 입력의 길이를 검사하지 않는데에 있었다. 패턴의 앞과 뒤가 동일할 때 입력으로 패턴 값이 주어질 경우, 잘못된 판단을 하는 것이다.
ex)
입력 값: "ab"
패턴 값: "ab*ab"
#include<iostream>
#include<string>
using namespace std;
int main() {
int case_cnt = 0;
cin >> case_cnt;
string pattern = "";
cin >> pattern;
string res = "";
for(int i = 0; i < case_cnt; i++) {
string input = "";
cin >> input;
bool is_end = false;
// 입력이 패턴 검사를 위한 길이보다 작을 경우
if(pattern.size() - 1 > input.size()) {
res += "NE\n";
continue;
}
int pattern_idx = 0;
int input_idx = 0;
while(pattern.at(pattern_idx) != '*') {
if(pattern.at(pattern_idx) != input.at(input_idx)) {
is_end = true;
break;
}
pattern_idx++;
input_idx++;
}
if(is_end) {
res += "NE\n";
continue;
}
pattern_idx = pattern.size() - 1;
input_idx = input.size() - 1;
while(pattern.at(pattern_idx) != '*') {
if(pattern.at(pattern_idx) != input.at(input_idx)) {
is_end = true;
break;
}
pattern_idx--;
input_idx--;
}
if(is_end) {
res += "NE\n";
} else {
res += "DA\n";
}
}
cout << res;
return 0;
}
패턴에서 '*'를 제외한 길이보다 입력의 길이가 더 작을 경우에 대한 검사 조건을 넣어주니 정상적으로 통과하게 되었다.