https://www.acmicpc.net/problem/9342
문제
상근이는 생명과학 연구소에서 염색체가 특정한 패턴인지를 확인하는 일을 하고 있다. 염색체는 알파벳 대문자 (A, B, C, ..., Z)로만 이루어진 문자열이다. 상근이는 각 염색체가 다음과 같은 규칙을 만족하는지 검사해야 한다.
- 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 시작해야 한다.
- 그 다음에는 A가 하나 또는 그 이상 있어야 한다.
- 그 다음에는 F가 하나 또는 그 이상 있어야 한다.
- 그 다음에는 C가 하나 또는 그 이상 있어야 한다.
- 그 다음에는 {A, B, C, D, E, F} 중 0개 또는 1개가 있으며, 더 이상의 문자는 없어야 한다.
문자열이 주어졌을 때, 위의 규칙을 만족하는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T ≤ 20 이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 최대 200개의 알파벳 대문자로 이루어진 문자열이 주어진다.
출력
각 테스트 케이스에 대해서, 문제의 규칙을 지키는 문자열인 경우에는 "Infected!"를, 아닌 경우에는 "Good"을 출력한다.
문제 풀이
정규식 문제.
C++에서의 정규식은 regex 라이브러리를 이용해 해결할 수 있다.
정규식 중 일부의 뜻은 다음과 같다.
.: 임의의 한 문자를 의미한다. 예를 들어 a.는 aa, ab, ac, ad, a1등과 일치한다.
[..]: 대괄호 [] 안에 여러 문자가 존재한다면 각각의 문자 중 하나를 뜻한다. 예를 들어 [x, y]나 [xy]는 x 또는 y를 의미한다.
? : 앞의 문자열이 0번 혹은 1번 반복됨을 의미한다.
*: 앞의 문자열이 0번 이상 반복됨을 의미한다.
+: 앞의 문자열이 1번 이상 반복됨을 의미한다.
따라서 위의 조건에 따라 우리에게 필요한 정규식은 [ABCDEF]?A+F+C+[ABCDEF]?가 된다.
bool regex_match(string str, regex r) 함수를 호출해 정규식과 일치하는지 확인한다.
아래는 코드.
#include <iostream>
#include <regex>
using namespace std;
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N;
string str;
regex r("[A, B, C, D, E, F]?A+F+C+[A, B, C, D, E, F]?");
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> str;
if (regex_match(str, r) == true)
{
cout << "Infected!"<<"\n";
}
else
{
cout << "Good"<<"\n";
}
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 7562] 나이트의 이동 (C++) (0) | 2024.07.02 |
---|---|
[백준 23330] 거리의 합 2 (C++) (0) | 2024.07.01 |
[백준 1051] 숫자 정사각형 (C++) (0) | 2024.06.29 |
[백준 17251] 힘 겨루기 (C++) (0) | 2024.06.28 |
[백준 29336] 월향, 비상 (C++) (0) | 2024.06.27 |