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 한다.
'Algorithm' 카테고리의 다른 글
올바른 괄호의 갯수 (12929번) - 프로그래머스 (Programmers) (0) | 2023.07.30 |
---|---|
이항 계수 3 (11401번) - 백준 (BOJ) (0) | 2023.07.29 |
오아시스 재결합 (3015번) - 백준 (BOJ) (0) | 2023.07.28 |
거의 최단 경로 (5719번) - 백준 (BOJ) (0) | 2023.07.28 |
철로 (13334번) - 백준 (BOJ) (0) | 2023.07.27 |