2224 명제 증명

정민용·2023년 4월 11일

백준

목록 보기
122/286

문제

수학, 혹은 논리학에서 만약 무엇 이라면 뭣 일 것이다 하는 식의 명제가 널리 쓰인다. 예를 들어 "P이면 Q일 것이다." 라는 명제는 “P => Q” 라는 기호로 표현된다. 이때의 P를 전건, Q를 후건이라고 한다.

논리학에서 어떤 명제를 증명할 때 가장 널리 쓰이는 방법 중 한 가지가 바로 삼단 논법이다. 만약 두 명제 “P => Q", "Q => R" 가 모두 참이면, 명제 "P => R"이 역시 참이 된다. 이러한 방법을 사용했을 때 명제 ”P => R"이 증명되었다고 한다.

어떤 참인 명제가 주어졌을 때, 이 명제가 참이므로 이 명제 자체도 증명될 수 있다고 할 수 있다. 하지만 “P => P”와 같은 명제는 항상 참이 되는데, 이런 식으로 전건과 후건이 같은 경우는 출력하지 않기로 한다.

N개의 참인 명제들이 주어졌을 때, 증명될 수 있는 명제를 모두 구해내는 프로그램을 작성하시오. 명제를 증명하는 방법은 여러 가지가 있을 수 있지만, 위에서 언급한 방법만을 사용하기로 한다.

# 13424
import sys
input = lambda : sys.stdin.readline().strip()
INF = int(1e9)

input_string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

n = int(input())
graph = [[INF] * (52) for _ in range(52)]
for _ in range(n):
    input_s = list(input().split(" => "))
    a, b = input_string.index(input_s[0]), input_string.index(input_s[1])
    graph[a][b] = 1
    
for k in range(52):
    for a in range(52):
        for b in range(52):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
            
count = 0
output_string = []
for i in range(52):
    for j in range(52):
        if i == j:
            continue
        if graph[i][j] != INF:
            output_string.append(input_string[i] + " => " + input_string[j])
            count += 1
            
print(count)
for o in output_string:
    print(o)

백준 2224 명제 증명

0개의 댓글