[Python] 백준 1013_Contact

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

이 문제는 입력된 신호가 (100+1+ | 01)+ 패턴을 가지는지 판별하는 문제이다. 두가지 방법으로 풀어 보았다.

1. 구현

문자열의 앞 인덱스부터 판별하여 특정 케이스를 만족하면 만족하는 부분을 제거해나가면서 중간에 중단하지 않고 모두 제거하여 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")

2. 정규표현식 이용

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")

좋은 웹페이지 즐겨찾기