프로그래머스_순위
** 프로그래머스_순위 개인 정리 글입니다.

https://programmers.co.kr/learn/courses/30/lessons/49191?language=python3
코딩테스트 연습 - 순위
5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2
programmers.co.kr
문제를 읽고 바로 의문이 들었던 것은 어떻게 하면 선수의 순위를 확정할 수 있는지에 대한 의문이 먼저 들었다.
아래 예시를 먼저 보면,
2번 선수는 [1, 3, 4] 선수에게 패배했고 5번 선수에게 승리했기 때문에 4위입니다.
각 선수별로 인덱스를 두고 보면 {0,0,0,0,0} 이다.
이때, {패배, ??, 패배, 패배, 승리} 에서 나머지 4개의 선수에 대한 결과값이 포함되어 있으면
한 선수의 순위를 확정지을 수 있다.
또, 5번 선수는 4위인 2번 선수에게 패배했기 때문에 5위입니다.
n에 대해 각 지점을 노드라고 생각하면 그래프 전부 탐색할 필요 없이 가장 확실한 부분만 간선을 태우면 된다.
플로이드 와샬 기법을 사용하면 모든 정점에서 모든 정점으로 최단 거리를 한번만 구하면 되는데 이
경우는 최단 거리를 찾는것은 아니고 전체를 다 보지 않고 가장 확실한 부분의 간선만 태우면 되기
때문에 플로이드 와샬을 적용하는것이 문제의 의도에 적합한 알고리즘이라 생각한다. (푸는 방법은
다양하다.)
플로이드 와샬의 기법을 사용하면 O(V^3) 만큼 수행하게 된다. 여기서는 n의 3제곱이 수행된다.
플로이드 와샬은 Dynamic Programming 방식으로 진행된다.
점화식 : distance[i,j] = min(distance[i,j], distance[i,n] + distance[n,j]) 처럼 쓰는것이 일반적이지만 여기
서는 단순히 어떤 지점을 거쳐가는지만 확인해보면 된다.
플로이드 와샬은 아래 플로우로 실행된다.
- 정점 i에서 정점 n을 거쳐서 정점 j로 갈 때, n을 거쳐 가는 것이 더 최단경로일 경우 업데이트 한다.
- 이렇게 거쳐갈 정점을 차례대로 모두 검사하여 업데이트 해나간다.
from collections import Counter | |
def solution(n, results): | |
# p1이 p2에 이겼을 때는 1로, | |
# p1이 p2에 졌을 때는 -1로 초기화 | |
board = [[0] * n for _ in range(n)] | |
for p1, p2 in results: | |
board[p1 - 1][p2 - 1] = 1 | |
board[p2 - 1][p1 - 1] = -1 | |
for k in range(n): # 1. 모든 노드를 중간점(경로)로 가정하며 | |
for i in range(n): # 2. 점수판을 순회 | |
for j in range(n): # 3. 만약 i가 k에 이겼고, k가 j에 이겼다면 | |
if board[i][j] == 0: # i는 j에게도 이김 (지는 것도 동일) | |
if board[i][k] == 1 and board[k][j] == 1: | |
board[i][j] = 1 | |
elif board[i][k] == -1 and board[k][j] == -1: | |
board[i][j] = -1 | |
# 각 노드 점수판에 0이 하나(다른 노드들에 대해 승패가 모두 결정됨)인 경우만 셈 | |
ans = 0 | |
for i in range(n): | |
if Counter(board[i])[0] == 1: | |
ans += 1 | |
return ans |
**코드 내용은 참고1블로그에 에서 코드를 참고하였습니다.
참고 :
1. https://summa-cum-laude.tistory.com/16
[프로그래머스] 순위 (Python)
코딩테스트 연습 - 순위 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 순위 5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2 programmers.co.kr 처음에는 딕셔너리와 세트로 풀이했는데 시간 초과가 났다..
summa-cum-laude.tistory.com
2. https://ansohxxn.github.io/algorithm/floyd/
(C++) 플로이드 와샬 Floyd Warshall (+ 최단 경로 알고리즘 비교)
👩🏼 플로이드 와샬 알고리즘
ansohxxn.github.io
댓글을 사용할 수 없습니다.