(BOJ1389 케빈 베이컨의 6단계 법칙

Link copied to clipboard

문제 설명

Link copied to clipboard
  • 플로이드 와샬 등을 활용하여 모든 점사이 가중치를 구하고, 그 중 최소를 출력해야한다.
    • BFS 등으로도 구할 수 있지만, 플로이드 와샬로 해결했다.

문제 풀이

Link copied to clipboard
friends = [[0] * N for _ in range(N)]
for _ in range(M):
    a, b = MIIS()
    friends[a - 1][b - 1] = 1
    friends[b - 1][a - 1] = 1
  • 친구 관계 행렬 구성
  • 기본적으로 관계가 없으면 0, 아니면 몇 번 건너 가면 만날 수 있는지 기록
for k in range(N):
    for i in range(N):
        for j in range(N):
            if i == j:
                continue
            if not friends[i][k] or not friends[k][j]:
                continue
            t = friends[i][k] + friends[k][j]
            if friends[i][j] and friends[i][j] <= t:
                continue
            friends[i][j] = t
            friends[j][i] = t
  • 거쳐가는 점, 시작 점, 도착점을 순서대로 순회
  • 시작점 == 도착점이면 넘어가고,
  • 둘러가는 경우가 새롭게 친구가 생기거나 더 가까운 경우라면 갱신
ans = [(sum(friends[i]), i + 1) for i in range(N)]
ans.sort()
print(ans[0][1])
  • 출력을 위해 list confrehension을 활용했고,
    • 해당 배열 정렬 후 인덱스 출력