https://www.acmicpc.net/problem/1013
이 문제는 입력된 신호가 (100+1+ | 01)+ 패턴을 가지는지 판별하는 문제이다. 두가지 방법으로 풀어 보았다.
문자열의 앞 인덱스부터 판별하여 특정 케이스를 만족하면 만족하는 부분을 제거해나가면서 중간에 중단하지 않고 모두 제거하여 True값을 리턴하면 "YES"를 출력하도록 구현하였다.
코드에 주석을 통해 최대한 자세히 설명을 적어놓았다.
import sys
input = sys.stdin.readline
#(100+1+ | 01)+
for i in range(int(input())):
s = input().rstrip()
result =True
while len(s)>0:
if s.startswith("100"):
s = s[3:] #"100"제
while len(s)>0 and s.startswith("0"): #0+에 0이 계속 나오는 경우
s=s[1:] #맨 처음 "0" 제거
if len(s)==0: #뒤에 1이 무조건 하나는 나와야하므로 False
result=False
break
s=s[1:] #맨 처음 "1"이나오는 경우 1제거
#여기까지 진행하면 100+1 은 만족
while len(s)>0 and s.startswith("1"):
if len(s)>=3 and s[1]=="0" and s[2]=="0": #"100"이 나오는 경우 고려를 위해 보류
break
else: #1+에 1이 계속 나오는 경우
s=s[1:]
elif s. startswith("01"):
s = s[2:]거 #"01"제거
else:
result=False
break
#결과 출력
if result: print("YES")
else: print("NO")
re 모듈은 정규식 엔진에 대한 인터페이스를 제공한다.
compile 메소드: 정규식 패턴 입력
fullmatch 메소드: 입력된 패턴과 문자열이 남는 부분 없이 완벽하게 일치하는지 검사. 일치하지 않으면 None.
import sys
input = sys.stdin.readline
import re
p = re.compile('(100+1+|01)+')
for i in range(int(input())):
s = input().strip()
if p.fullmatch(s):
print("YES")
else:
print("NO")