9996. 예외처리
https://www.acmicpc.net/problem/9996
[풀이]
substr()과 find()를 사용해서 구현할 수도 있고 나처럼 reverse()를 사용해 구현할 수도 있다.
패턴에서 앞에서부터 *가 나올 때까지를 파일이름의 앞에서부터 비교하고,
패턴에서 뒤에서부터 *가 나올 때까지를 파일이름의 뒤에서부터 비교하며
패턴과 파일이름이 다르면 flag++ 한다.
이 때 예외처리를 생각하지 못해서 많이 틀렸는데 패턴의 길이가 파일이름보다 길 때가 있을 수 있다.
이럴 때 NE를 출력해야하는데 DA를 출력하는 경우가 발생한다.
예를 들어, 패턴이 aa*aa이고 파일명이 aaa이라면 앞에서부터 비교해도 aa가 존재하고 뒤에서부터 비교해도 aa가 존재해 flag=0이며 DA를 출력하게 된다. 따라서 패턴의 길이가 파일명보다 긴 경우를 예외 처리해주는 로직을 추가하면 된다.
#include <bits/stdc++.h>
using namespace std;
string pattern, input;
int T, flag;
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin >> T;
cin >> pattern;
for (int t=0; t<T; t++){
cin >> input;
// 0. 예외처리
if (input.size() < pattern.size()-1) { cout << "NE" << "\n"; continue; }
// 1. 앞에서부터 * 전까지 비교
for (int i=0; i<pattern.size(); i++) {
if (pattern[i] == '*') break;
if (input[i] != pattern[i]) flag++;
}
// 2. 뒤에서부터 * 후까지 비교
reverse(pattern.begin(), pattern.end());
reverse(input.begin(), input.end());
for (int i=0; i<pattern.size(); i++) {
if (pattern[i] == '*') break;
if (input[i] != pattern[i]) flag++;
}
// 3. 결과 출력
if (flag == 0) cout << "DA" << '\n';
else cout << "NE" << '\n';
flag = 0;
reverse(pattern.begin(), pattern.end());
}
}
'PS' 카테고리의 다른 글
BOJ - 2493. 탑 (C++) (0) | 2024.03.12 |
---|---|
BOJ - 2559. 수열 (C++) (0) | 2024.03.07 |
BOJ - 3273. 두 수의 합 (C++) (0) | 2024.03.07 |
BOJ - 10988. 팰린드롬인지 확인하기 (C++) (0) | 2024.03.01 |
BOJ - 10804. 카드 역배치 (C++) (0) | 2024.02.28 |