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

+ Recent posts