https://www.acmicpc.net/problem/1013

[필자 사고]
regex 정규식 라이브러리를 이용하면 쉽게 풀 수 있다.
필자는 정규식 관련해서 처음 보는 지식이였다.
이런 알고리즘도 있구나 정도로만 하고 넘어가야 겠다.
[코드 해설]
프로그램의 흐름은 다음과 같다:
- 입력으로 테스트 케이스의 개수를 받는다.
- 테스트 케이스 수만큼 반복해서 문자열(0과 1로만 구성)을 입력 받는다.
- 입력받은 문자열이 정규 표현식 (100+1+|01)+의 형태를 정확하게 만족하는지 검사한다.
- 여기서 (100+1+)는 1 다음에 0이 최소 두 개 이상 나오고 다시 1이 최소 하나 이상 나오는 패턴을 말한다.
예시: 1001, 1000011, 10001 등 - |는 또는(OR)의 의미다.
- (01)은 정확히 0 뒤에 1이 오는 패턴이다.
- 끝의 +는 앞의 패턴이 최소한 한 번 이상 반복되어야 한다는 의미다.
- 여기서 (100+1+)는 1 다음에 0이 최소 두 개 이상 나오고 다시 1이 최소 하나 이상 나오는 패턴을 말한다.
- 정규 표현식을 만족하면 YES를 출력하고, 아니면 NO를 출력한다.
요약하자면, 이 프로그램은 주어진 문자열이 문제에서 정의된 외계 전파의 패턴을 만족하는지 빠르게 판별하는 간단하고 명료한 코드다.
[소스 코드]
#include <iostream>
#include <string>
#include <regex>
using namespace std;
void solve(void);
int main(void) {
int test_case;
cin >> test_case;
for (int t = 0; t < test_case; t++)solve();
}
void solve(void) {
string bits;
cin >> bits;
regex pattern("(100+1+|01)+");
cout << (regex_match(bits, pattern) ? "YES\n" : "NO\n");
}
'백준 > 문자열' 카테고리의 다른 글
백준 16120 c++ "PPAP" -PlusUltraCode- (0) | 2025.04.07 |
---|---|
백준 1958 c++ "LCS 3" -PlusUltraCode- (0) | 2025.04.03 |
백준 17609 c++ "회문" -PlusUltraCode- (0) | 2025.04.03 |
백준 5582 c++ "공통 부분 문자열" -PlusUltraCode- (0) | 2025.04.02 |
백준 12904 c++ "A와 B" -PlusUltraCode- (0) | 2025.04.01 |