▶ 문제출처:
https://www.acmicpc.net/problem/9996
9996번: 한국이 그리울 땐 서버에 접속하지
총 N개의 줄에 걸쳐서, 입력으로 주어진 i번째 파일 이름이 패턴과 일치하면 "DA", 일치하지 않으면 "NE"를 출력한다. 참고로, "DA"는 크로아티어어로 "YES"를, "NE"는 "NO"를 의미한다.
www.acmicpc.net
▶ 문제설명:
패턴 여부를 가리는 문제로 패턴은 알파벳 소문자 여러개와 별표(*) 하나로 이루어진 문자열이다.
aas*ds 라고 하면 aas ~ ds 가 있는 문자열에 DA 그렇지 않은 문자열에 NE를 출력한다.
▶ 로직:
1. 패턴 문자열에서 '*' 패턴 위치를 찾는다.
2. '*' 이전의 문자열과 '*' 이후의 문자열을 각 구한다.
3. 새로운 문자열이 입력되지면 새 문자열의 0번째 ~ '*' 위치 이전 까지의 문자열이 2번의 이전 문자열과 동일해야하며,
4. 새로운 문자열의 길이에서 2번의 이후의 문자열 길이를 빼서 substr로 만들어진 문자열이 2번의 이후의 문자열과 비슷해야 한다.
5. 3과 4번 모두 충족되면 DA 그렇지 않으면 NE를 출력한다.
6. 만일 패턴문자열이 입력문자열보다 크면 패턴이 존재하지 않는다는 의미로 NE를 출력한다.
#include<bits\stdc++.h>
using namespace std;
int n;
string s, ori_s, pre, suf;
int main(void)
{
cin >> n;
cin >> ori_s;
int pos = ori_s.find('*'); // 패턴 * 인덱스 찾기.
pre = ori_s.substr(0, pos); // 패턴 이전의 문자열
suf = ori_s.substr(pos + 1); // 패턴 이후의 문자열
for (int x = 0; x < n; ++x)
{
cin >> s; //입력할 문자열
if (s.length() < ori_s.length() - 1) // 입력 문자열이 *제외한 패턴 문자열 보다 작으면 NE
{
cout << "NE\n";
continue;
}
if ((s.substr(0, pos) == pre) && (suf == s.substr(s.length() - suf.length()))) //문자열 s 중 pos 위치이전의 문자열과 pre와 비교, 문자열 s를 substr 문자열 자르기 통해 시작점을 suf문자열 길이에서 패턴* 이후의 문자열을 뺸 수부터 시작하여 나온 문자열과 suf 비교
{
cout << "DA" << endl;
}
else cout << "NE" << endl;
}
}
'PS > 백준' 카테고리의 다른 글
[한양대 HCPC 2023] Pipelined (백준: 30874번) (0) | 2024.11.01 |
---|---|
15686 치킨배달 (0) | 2024.08.22 |
1062번 가르침 [다시보기] (0) | 2024.07.24 |
10844번 쉬운 계단 수 (0) | 2024.07.08 |
1931번 회의실배정 (V) (0) | 2023.07.19 |