https://www.acmicpc.net/problem/15723
15723번: n단 논법
m개의 줄에 걸쳐 각 줄에 결론이 참인지 거짓인지 출력하라. 참일 경우 T, 거짓일 경우 F를 출력하라. 알 수 없는 경우도 거짓이다. 답은 필히 대문자로 출력해야 한다.
www.acmicpc.net
- 문제의 조건을 잘 파악한다면, 각 노드(알파벳)는 하나의 노드만 가리킨다고 볼 수 있다.
- 노드가 최대 26개이며 쿼리는 최대 10개이기 때문에, 각 쿼리마다 해당 노드로부터 연결된 모든 노드들을 탐색해도 연산량이 충분히 작다.
- 그대로 구현하면 되는데, 골드 5로 선정된 이유는 플로이드-와샬을 쓰는 경우 때문인 것 같다.
- 모든 노드에 대해 플로이드 와샬을 돌려서 최단 거리가 존재하면 논법이 성립되는 것이다.
n = int(input())
logic = [-1] * 26
for i in range(n): # a 는 b 이면서 c 일 수 없다 == 각 노드는 하나의 노드만 가리킨다
x, y = map(lambda x: ord(x)-97, input().split(" is "))
logic[x] = y
m = int(input())
for i in range(m): # m 이 최대 10개이고, n 은 26개이기 때문에 dfs 돌리듯 논법을 탐색
visited = [False] * 26
x, y = map(lambda x: ord(x)-97, input().split(" is "))
while logic[x] != -1: # 연결된 논법의 끝까지 탐색
visited[x] = True
x = logic[x]
if visited[x]: # 논법이 순환하면
break
if x==y: # 논법 성립하면 종료
break
print('T' if x==y else 'F')
'PS > BOJ' 카테고리의 다른 글
[백준] 4386 : 별자리 만들기 (0) | 2021.06.11 |
---|---|
[백준] 11054 : 가장 긴 바이토닉 부분 수열 (0) | 2021.06.10 |
[백준] 3190 : 뱀 (0) | 2021.06.08 |
[백준] 11265 : 끝나지 않는 파티 (0) | 2021.06.07 |
[백준] 17396 : 백도어 (0) | 2021.06.06 |