어디까지 갈 수 있을까?

[플로이드 워셜] 백준 2224 명제 증명 본문

알고리즘/문제

[플로이드 워셜] 백준 2224 명제 증명

_Min 2021. 2. 27. 21:44

문제링크 www.acmicpc.net/problem/2224

 

 

 

[답코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import sys
 
input = sys.stdin.readline
INF = int(1e9)  # 무한을 의미하는 값으로 10억을 설정
 
# 2차원 리스트(그래프 표현)를 만들고, 모든 값을 무한으로 초기화
graph = [[INF] * (52for _ in range(52)]
 
for _ in range(int(input())):
    a, b, c = input().split()
 
    a_ord = ord(a)
    c_ord = ord(c)
 
    # 소문자
    if a_ord >= ord('a'):
        a_ord = a_ord - (ord('a'- ord('Z'- 1)
    # 소문자
    if c_ord >= ord('a'):
        c_ord = c_ord - (ord('a'- ord('Z'- 1)
 
    a_ord = a_ord - ord('A')
    c_ord = c_ord - ord('A')
 
    graph[a_ord][c_ord] = 1
 
# 자기 자신에서 자기 자신으로 가는 비용은 0으로 초기화
for a in range(52):
    for b in range(52):
        if a == b:
            graph[a][b] = 0
 
# 점화식에 따라 플로이드 워셜 알고리즘을 수행
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])
 
arr = []
# 수행된 결과를 출력
for a in range(52):
    for b in range(52):
        # 도달할 수 없는 경우, 무한(INFINITY)이라고 출력
        if graph[a][b] == 0 or graph[a][b] == 1e9:
            pass
        # 도달할 수 있는 경우 거리를 출력
        else:
            arr.append(a)
            arr.append(b)
            # print(graph[a][b], end=" ")
 
print(len(arr) // 2)
for i in range(0len(arr), 2):
    # print(arr[i], arr[i+1])
    a = arr[i]
    c = arr[i + 1]
 
    # 소문자
    if a > 25:
        a = a + (ord('a'- ord('Z'- 1)
    # 소문자
    if c > 25:
        c = c + (ord('a'- ord('Z'- 1)
 
    a = a + ord('A')
    c = c + ord('A')
 
    print("%c => %c" % (chr(a), chr(c)))
 
cs

 

 

 

[풀이법]

 

아스키코드를 이용해서 대문자는 인덱스 0~25까지 담고 소문자는 인덱스 26~51까지 담는다

728x90
Comments