어디까지 갈 수 있을까?
[플로이드 워셜] 백준 2224 명제 증명 본문
문제링크 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] * (52) for _ 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(0, len(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
'알고리즘 > 문제' 카테고리의 다른 글
[그리디] 프로그래머스 무지의 먹방 라이브 (0) | 2021.03.04 |
---|---|
[Union-Find] 백준 10775 공항 (0) | 2021.03.02 |
[플로이드 워셜] 백준 11403 경로 찾기 (0) | 2021.02.27 |
[이분탐색] 백준 7795 먹을 것인가 먹힐 것인가 (0) | 2021.02.19 |
[BFS/DFS] 백준 2606 바이러스 (0) | 2021.02.17 |
Comments