본문 바로가기
백준/문자열

백준 1013 c++ "Contact" -PlusUltraCode-

by PlusUltraCode 2025. 4. 3.

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

\

[필자 사고]

regex 정규식 라이브러리를 이용하면 쉽게 풀 수 있다.

필자는 정규식 관련해서 처음 보는 지식이였다.

이런 알고리즘도 있구나 정도로만 하고 넘어가야 겠다.

[코드 해설]

프로그램의 흐름은 다음과 같다:

  1. 입력으로 테스트 케이스의 개수를 받는다.
  2. 테스트 케이스 수만큼 반복해서 문자열(0과 1로만 구성)을 입력 받는다.
  3. 입력받은 문자열이 정규 표현식 (100+1+|01)+의 형태를 정확하게 만족하는지 검사한다.
    • 여기서 (100+1+)는 1 다음에 0이 최소 두 개 이상 나오고 다시 1이 최소 하나 이상 나오는 패턴을 말한다.
      예시: 1001, 1000011, 10001 등
    • |는 또는(OR)의 의미다.
    • (01)은 정확히 0 뒤에 1이 오는 패턴이다.
    • 끝의 +는 앞의 패턴이 최소한 한 번 이상 반복되어야 한다는 의미다.
  4. 정규 표현식을 만족하면 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");

}