본문 바로가기

Algorithm

Contact (1013번) - 백준 (BOJ)

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

 

1013번: Contact

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 전파를 표현하는, { 0, 1 }만으로 이루어진 문자열이 공백 없이 주어진다. 문자열 길이는 (1 ≤

www.acmicpc.net

 

 

백준 - Concat (1013번)

 

난이도 : Gold 5

알고리즘&자료구조 : Simulation (구현)

 


 

패턴 탐지 및 예외처리를 코드로 잘 구현해야 하는 문제이다.

 

이 문제는 본문의 코드처럼 풀 수도 있지만,

아래 링크와 같이 정규표현식 (Regular Expression) 을 활용해서, 아주 간단하게 해결할 수 있기도 하다.

< 참고 : https://nerogarret.tistory.com/30 >

 

 

< 전체 코드 >

import sys
input = sys.stdin.readline


def _check(signal):
    n = len(signal)
    i = 0
    while i < n:
        if int(signal[i]):
            if signal[i:i+3] == '100':
                i += 3
            else:
                return 'NO'
            while i < n and not int(signal[i]):
                i += 1
            if not i < n:
                return 'NO'
            i += 1
            while i < n and int(signal[i]):
                i += 1
        else:
            if signal[i:i+2] == '01':
                i += 2
            elif 2 <= i and signal[i-2] == '1' and signal[i-1:i+2] == '100':
                i -= 1
            else:
                return 'NO'
    return 'YES'


class Contact():
    def __init__(self, T):
        self.answer = '\n'.join(_check(input().rstrip()) for _ in range(T))


if __name__ == '__main__':
    contacts = Contact(int(input()))
    print(contacts.answer)

 

 

 


 

첫 번째 문자가 '1' 이라면, '100+1+' 패턴에 대해서 검사한다.

if int(signal[i]):
    if signal[i:i+3] == '100':
        i += 3
    else:
        return 'NO'
    while i < n and not int(signal[i]):
        i += 1
    if not i < n:
        return 'NO'
    i += 1
    while i < n and int(signal[i]):
        i += 1

 

 

 

첫 번째 문자가 '0' 이라면, '01' 패턴에 대해서 검사한다.

else:
    if signal[i:i+2] == '01':
        i += 2
    elif 2 <= i and signal[i-2] == '1' and signal[i-1:i+2] == '100':
        i -= 1
    else:
        return 'NO'

 

만약 '01'이 아니라면,

현재 '0'이 첫 번째 패턴인 '100+1+'의 '100'의 두 번째 '0'일 가능성이 있으므로

이를 따로 확인해야 한다.

elif 2 <= i and signal[i-2] == '1' and signal[i-1:i+2] == '100':
    i -= 1

 

만약 '100'의 '0'으로 판단된다면, 위의 ① 단계를 진행한다.

 

 

 

③ 현재 신호의 끝까지 다 탐색하고 아무 이상이 없다면,

'YES'를 return 한다.