https://github.com/Dev-Guccin
Guccin
https://github.com/Dev-Guccin
전체 방문자
오늘
어제
  • 분류 전체보기 (172)
    • 알고리즘 (140)
    • 삽질방지 (13)
    • SystemHacking (1)
    • 일상 (4)
    • 개발 (8)
    • 스프링 부트 REST API 개발일지 (5)
    • JPA (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스
  • Python
  • 다이나믹프로그래밍
  • counter
  • BFS
  • 유니온 파인드
  • 그리디
  • 다익스트라
  • 최소힙
  • 이분 탐색
  • 그래프
  • 재귀함수
  • DFS
  • 최단경로
  • 큐
  • 12015
  • 백준
  • 백트래킹
  • DP
  • MST
  • 최대공약수
  • 스택
  • 파이썬
  • python3
  • 다이나믹 프로그래밍
  • 유클리드호제법
  • heapq
  • 이분탐색
  • 재귀
  • LIS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
https://github.com/Dev-Guccin

Guccin

[python3] 백준 1389 풀이 ( 케빈 베이컨의 6단계 법칙, 플로이드 워샬 )
알고리즘

[python3] 백준 1389 풀이 ( 케빈 베이컨의 6단계 법칙, 플로이드 워샬 )

2021. 8. 18. 13:47

이번 문제는 케빈 베이컨의 6단계 법칙이다. 케빈 베이컨이 할리우드의 핵 인싸라는 것을 인지하고 문제에 들어가자.

문제를 보자

문제가 상당히 길다. 읽어보면 그냥 네트워크 안에서 여러 사람들과 연결되어 있을때 모든 타인과 몇번만에 연결되어 있는지를 알아내어 최솟값을 가지는 즉, 허브 역할을 하는 사람을 구하면 된다.

문제를 잘 읽어보면 결국 N정점에서 N정점으로의 갈 때 얼마나 걸리는지를 구해야 한다. 그래야 한 노드에서 모든 노드에 방문할 때 케빈 베이컨의 수를 구할 수 있다. 즉, 모든 쌍 최단 거리 알고리즘을 사용하면 구할 수 있다.
모든 쌍 최단 거리 알고리즘의 대표적인 놈이 "플로이드 워샬"이다.
그러나! 플로이드 워샬은 O(N^3)이 걸리기 때문에 N값이 너무 크면 문제가 발생할 수 있다. 다행히 이번 문제에서 주어진 정점의 최댓값은 100이고 N^3을 한다면 1,000,000이기 때문에 100만의 연산으로도 답을 구할 수 있다. 따라서 플로이드 워샬로도 충분히 풀 수 있다는 생각이 들었다.

그럼 플로이드 워샬의 사용방법을 한번 복기해보자.

1. INF의 값으로 dp를 채운다.
2. dp[i][i]는 0으로 만든다.
3. k, i, j 순으로 루프를 돌린다.
4. 점화식은 dp[i][j] = min( dp[i][k] + dp[k][j], dp[i][j] )

이제 코드로 만들면 아래와 같다.

'''
N-> N 로 가는 경우의 수를 구하면된다.
즉, 모든쌍 최단거리 알고리즘을 사용한다.

N이 100이기 때문에 N^3을 해도 시간초과가 나진 않을것.
'''

INF = 1000
N,M = map(int, input().split())

dp = [[INF for i in range(N+1)] for i in range(N+1)]

adj = [[]for i in range(N+1)]
for _ in range(M):
    a,b = map(int, input().split())
    dp[a][b] = 1
    dp[b][a] = 1

    dp[a][a] = 0
    dp[b][b] = 0

# 플워는 kij
for k in range(1, N+1):
    for i in range(1,N+1):
        for j in range(1, N+1):
            dp[i][j] = min(dp[i][k]+dp[k][j], dp[i][j])

small = INF
smallF = 1
for i in range(N,0,-1):
    if small >= sum(dp[i][1:]):
        small = sum(dp[i][1:])
        smallF = i
print(smallF)

 

결론 : 플로이드 워샬에 INF들어가는거 까먹었었는데 다시 복기했다. 잊지말자

저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

코딩테스트 알고리즘별 전략 및 요약 (수정 중...)  (0) 2021.08.20
[python3] 백준 1916 풀이 ( 최소비용 구하기, 다익스트라, 그래프 )  (0) 2021.08.19
[python3] 프로그래머스 입국심사 풀이 ( 이분 탐색 )  (0) 2021.08.17
[python3] 백준 14360 풀이 ( 구슬 탈출 2, BFS, 방문체크 없음 )  (0) 2021.08.13
[python3] 백준 16236 풀이 ( 아기상어, 그래프, BFS, sort, pq? )  (0) 2021.08.12
    '알고리즘' 카테고리의 다른 글
    • 코딩테스트 알고리즘별 전략 및 요약 (수정 중...)
    • [python3] 백준 1916 풀이 ( 최소비용 구하기, 다익스트라, 그래프 )
    • [python3] 프로그래머스 입국심사 풀이 ( 이분 탐색 )
    • [python3] 백준 14360 풀이 ( 구슬 탈출 2, BFS, 방문체크 없음 )
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin

    티스토리툴바