Skip to content

Conversation

@JHLEE325
Copy link
Contributor

🧷 문제 링크

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

🧭 풀이 시간

70분

👀 체감 난이도

✏️ 문제 설명

전파의 기본 단위는 { 0 , 1 } 두 가지로 구성되어있으며, x+ ( ) 는 임의의 개수(최소 1개) x의 반복으로 이루어진 전파의 집합을 나타냅니다.
ex)
1+ = { 1, 11, 111, 1111, 11111, … }
10+ = { 10, 100, 1000, 10000, 100000, … }
(01)+ = { 01, 0101, 010101, 01010101, 0101010101, … }
(1001)+ = { 1001, 10011001, 100110011001, … }
10+11 = { 1011, 10011, 100011, 1000011, 10000011, … }
(10+1)+ = { 101, 1001, 10001, 1011001, 1001101, 100011011000001, … }

또 다른 기호 | 는 x 혹은 y를 의미하는 것으로 + 기호와 함께 사용했을 경우의 예시는 아래와 같습니다.
ex)
(0+ | 1+) 는 { 0 , 1 , 00 , 11 , 000 , 111 , … }
(100 | 11)+ = { 100 , 11 , 10011 , 11100 , 1110011100 , 100111111100100, … }

이 때 주어진 전파가 (100+1+ | 01)+ 의 조건을 만족하면 YES 아니면 NO를 출력하는 문제입니다.

🔍 풀이 방법

각 단계별로 DP? 처럼 분기를 여러 state로 두어서 처리했습니다.
예를들어 1로 시작했을 때 지금 숫자가 0인 경우면 100 패턴이 시작하는 state를 하나 두거나
0으로 시작했을 때 지금이 0이면 1000 패턴의 일부이고 0으로 시작했는데 지금이 1이면 01 패턴이거나 다른 패턴이 종료되거나 하는 식으로
최대한 단계별로 판단하여 풀었습니다.

⏳ 회고

분기 나누는게 복잡해서 조금 어려운 구현 문제인 줄 알았는데
풀이 후 적용 알고리즘을 보니 정규식 / 문자열 문제라고 되어 있었습니다.
알고보니 주어진 (100+1+ | 01)+ 를 정규식으로 하는 문자열 판별 라이브러리를 사용할 수 있었습니다.
알면 1분컷, 모르면 1시간도 걸리는 문제였던 것 같습니다.

그리고 애초에 문제 이해 자체가 쉽지 않았습니다.

@JHLEE325 JHLEE325 added the success 👍 해설을 보지 않고 풀었을 때 label Jan 24, 2026
@ShinHeeEul ShinHeeEul merged commit 037a7f3 into main Jan 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants