백준/문자열
백준 1013 c++ "Contact" -PlusUltraCode-
PlusUltraCode
2025. 4. 3. 11:39
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");
}