728x90
반응형

💻 문제 정의
n명의 권투선수가 권투 대회에 참여했고 각각 1번부터 n번까지 번호를 받았습니다. 권투 경기는 1대1 방식으로 진행이 되고, 만약 A 선수가 B 선수보다 실력이 좋다면 A 선수는 B 선수를 항상 이깁니다. 심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.
선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성한다.
💡 접근 및 설계
A가 B를 이긴다고 하였을 때, 단순히 상하관계를 따지는 것이 아닌, 나머지 C, D, E, … 와의 승패도 따져야 한다. 만약 따질 수 없다면 등수를 확정 지을수 없게 된다. 또한 A가 B를 이기고, B가 C를 이긴다면 자연스레 A가 C를 이긴다는 것을 알 수 있다. 따라서 A와 C는 붙지 않아도 승패를 확정할 수 있다.
n명의 선수가 나 제외 n-1명의 선수와 승패가 확정된다면 해당 선수의 등수를 확정 지을 수 있게 된다는 점을 이용하여 접근하였다.
✏️ 알고리즘 풀이
win = [[False] * (n+1) for _ in range(n+1)]
for a, b in results:
win[a][b] = True
for k in range(1, n+1):
for i in range(1, n+1):
for j in range(1, n+1):
if win[i][k] and win [k][j]:
win[i][j] = True
플로이드-워셜을 이용하여 문제를 해결하였다. A가 B를 이기고, B가 C를 이긴다면, A는 C를 이긴다. 즉 A와 C의 승패가 확실해졌다는 것을 이용한다.
answer = 0
for i in range(1, n+1):
cnt = 0
for j in range(1, n+1):
if win[i][j] or win[j][i]:
cnt += 1
if cnt == n-1:
answer += 1
각 선수에 대해서 승패가 확정난 인원이 n-1명이면 해당 선수의 등수를 확정지을 수 있으므로 정답에 +1 해준다.
🗒️ 최종 제출 코드
def solution(n, results):
win = [[False] * (n+1) for _ in range(n+1)]
# 초기 세팅
for a, b in results:
win[a][b] = True
# i가 k를 이기고, k가 j를 이긴다면, i는 자동으로 j를 이긴다.
for k in range(1, n+1):
for i in range(1, n+1):
for j in range(1, n+1):
if win[i][k] and win [k][j]:
win[i][j] = True
answer = 0
for i in range(1, n+1):
cnt = 0
for j in range(1, n+1):
# i와 j가 싸운적이 있다면, 수 증가
if win[i][j] or win[j][i]:
cnt += 1
# 싸운 상대가 나 제외 n-1명이면 모든 상대외 승부가 결정되었기에 등수를 확정할 수 있다.
if cnt == n-1:
answer += 1
return answer
💭 오늘의 회고
-
728x90
반응형
'Coding-Test > 프로그래머스' 카테고리의 다른 글
| [Python] 징검다리 (1) | 2026.03.25 |
|---|---|
| [Python] 단속카메라 (0) | 2026.03.24 |
| [Python] 섬 연결하기 (0) | 2026.03.23 |
| [Python] 구명보트 (0) | 2026.03.22 |
| [Python] 조이스틱 (0) | 2026.03.21 |