https://www.acmicpc.net/problem/9996
알파벳 소문자 여러 개와 별표 하나로 이루어진 문자열이 패턴으로 주어진다. 별표를 기준으로 접두사와 접미사로 나눈다.
n개 줄에 걸쳐 입력으로 주어진 파일이름의 접두사와 접미사가 일치하는지 판단하는 문제다.
1차 풀이 - 별표의 index를 알고(=check) check index전까지는 front문자열, 그 뒤로는 back 문자열이라고 저장해서 입력받은 파일 이름을 하나하나 비교하는 방식으로 풀이했다.
예외처리가 필요했다. ab * ab 같은 경우 ab가 파일 이름으로 주어지면 일치하지 않는 것으로 처리해야하지만 이 예외를 처리해주지 않으면 이게 일치하는 답이라고 나온다.
+for문으로 필요한거 찾느라 코드가 너무 길어졌다..
(코드짜면서 생각을 시작해서 코드가 주구장창 길어짐)
int n;
string p,s,front,back,tmp;
int check;
int main() {
cin >> n;
cin >> p;
for (int i = 0; i < p.length(); i++) {
if (p[i]=='*') {
check = i;
break;
}
}
for (int i = 0; i < p.length(); i++) {
if (i < check)front += p[i];
else if(i>check) back += p[i];
}
for (int j = 0; j < n; j++) {
int flag = 0;
cin >> tmp;
if (tmp.length() < p.length()-1) flag = 1;
for (int i = 0; i < front.length(); i++) {
if (tmp[i] != front[i]) {
flag = 1;
break;
}
}
int k = back.length()-1;
if (flag == 0) {
for (int i = tmp.length()-1; i >= tmp.length()-back.length(); i--) {
if (tmp[i] != back[k]) {
flag = 1;
break;
}
k--;
}
}
if (flag == 1) {
cout << "NE" << "\n";
}
else {
cout << "DA" << "\n";
}
}
}
2차 풀이
int n;
string p,s,front,back,tmp;
int check;
int main() {
cin >> n;
cin >> p;
check = p.find('*');
front = p.substr(0, check);
back = p.substr(check + 1);
for (int i = 0; i < n; i++) {
cin >> tmp;
if (tmp.length() < front.size() + back.size())
cout << "NE\n";
else {
if (front == tmp.substr(0, front.size())
&& back == tmp.substr(tmp.size() - back.size())) {
cout << "DA\n";
}
else {
cout << "NE\n";
}
}
}
}
🤣
check = p.find('*');
문자열 p에서 별표에 해당하는 문자의 index 추출하기
(간단...)
front = p.substr(0, check);
back = p.substr(check + 1);
substr을 이용해서 문자열 자르기!