programmers.co.kr/learn/courses/30/lessons/49191
코딩테스트 연습 - 순위
5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2...
programmers.co.kr
풀이
그래프를 그려본다.
그래프를 그려보고 경로가 다른 노드들과 모두 이어져 있는 노드를 찾는다.
![[프로그래머스lv.3] 순위 - 풀이 [프로그래머스lv.3] 순위 - 풀이](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
4는 모든 녀석과 이어져 있다. 1은 3을 모르고 2는 6을 모르고 3은 1을 모르고 5는 3을 모르고 6은 2를 모른다.
여기서 4라는 모든 경로와 이어진 노드를 어떻게 찾을 수 있을까?
플로이드 와샬을 활용하면 된다.
플로이드 와샬은 모든 노드의 최단거리를 찾아준다.
그 점을 이용해서 노드가 이어져 있는지를 확인한다. 최단거리가 존재하지 않다면 경로가 없다는 것이다.
백준의 [2458번]키순서와 문제가 같다.
시간복잡도
플로이드 와샬의 시간복잡도와 같다. for문 3개를 중첩해서 사용하기에 O(n^3)이다.
코드
def solution(n, results):
INF = 9873654321
mat = [[0 if i==j else INF for i in range(n+1)] for j in range(n+1)]
for result in results:
a,b = result
mat[a][b] = 1
for k in range(1,n+1):
for i in range(1,n+1):
for j in range(1,n+1):
if i==j:
mat[i][j] = 0
else:
mat[i][j] = min(mat[i][j],mat[i][k] + mat[k][j])
for i in mat:
print(i)
print()
connect=[1]*(n+1)
connect[0] = 0
for i in range(1,n+1):
for j in range(1,n+1):
if mat[i][j] == INF and mat[j][i] == INF:
connect[i] = 0
connect[j] = 0
return sum(connect)
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[2018 KAKAO BLIND RECRUITMENT] 셔틀버스 (0) | 2021.05.08 |
---|---|
[2019 카카오 개발자 겨울 인턴십] 불량 사용자 (0) | 2021.05.05 |
[프로그래머스lv.3] 정수 삼각형 (0) | 2021.05.04 |
[프로그래머스lv3] [2020 카카오 인턴십] 보석 쇼핑 (0) | 2021.05.04 |
[프로그래머스.lv3] 입국심사 (0) | 2021.05.03 |
댓글