https://www.acmicpc.net/problem/1013
풀이 과정
- 주어진 문제 (100+1+ | 01)+로 DFA를 구성한다.
- 100+1+에서 마지막에 0이 나온 경우, 100+1+로 이동할지 01로 이동할지 알수 없음.
- 따라서, 100+1+에서 1과 0을 추가로 만들어 주어서 1->0->0->1->1->0으로 구성
- 네번째 1에서 0이 나온 경우는 01로 이동, 여섯번째 0에서 0이 나온 경우는 세번째 0으로 이동하도록 DFA 구성
- 각각의 테스트 케이스에 대하여 오토마타를 타고 넘어가본다. 이 때, 실패하는 케이스에 대해서는 바로 NO를 출력시켜 주고 다음 테스트 케이스를 진행한다.
- 최종적으로 종료상태에 들어간 경우에만 YES를 출력해주고, 종료상태에 들어가지 않은 경우 NO를 출력시켜 준다.
소스 코드
import sys
input = lambda: sys.stdin.readline().rstrip()
n = int(input())
total_case = list()
for _ in range(n):
s = input()
automata = 'S'
for ch in s:
if automata == 'S':
if ch == '1':
automata = 1
else:
automata = 2
elif automata == 1:
if ch == '1':
print('NO')
break
else:
automata = 3
elif automata == 2:
if ch == '1':
automata = 7
else:
print('NO')
break
elif automata == 3:
if ch == '0':
automata = 4
else:
print('NO')
break
elif automata == 4:
if ch == '0':
continue
else:
automata = 5
elif automata == 5:
if ch == '0':
automata = 2
else:
automata = 6
elif automata == 6:
if ch == '0':
automata = 8
else:
continue
elif automata == 7:
if ch == '0':
automata = 2
else:
automata = 1
elif automata == 8:
if ch == '0':
automata = 4
else:
automata = 7
else:
if automata == 7 or automata == 5 or automata == 6:
print('YES')
else:
print('NO')
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 16922 ] [ BFS ] 로마 숫자 만들기 (0) | 2021.11.30 |
---|---|
[ 23630 ] 가장 긴 부분 수열 구하기 (0) | 2021.11.25 |
[ 14712 ] [ backtracking ] 넴모넴모(Easy) (0) | 2021.11.20 |
[ 17073 ] [ BFS ] 나무 위의 빗물 (0) | 2021.11.18 |
[ 2250 ] [ Tree ] 트리의 높이와 너비 (0) | 2021.11.16 |