본문 바로가기

프로그래머스 퀴즈(Python)/level 3

23.03.09 파이썬 코딩 퀴즈#193 순위(프로그래머스 스쿨)

이번 문제는 순위 문제이다.

n 명의 선수가 주어지고, 선수들간의 1:1 경기 결과가 results로 주어진다. 이때 주어지는 [A,B]는 A선수가 B 선수를 이겼다는 의미이다.

이때 순위를 매길 수 있는 선수의 수를 구하여 return 해야 한다...

 

입출력 예를 살펴보면 먼저 4 > 3 이 성립한다. 그리고 4 > 2, 3 > 2 이므로 [4,3,2] 순위가 된다. 그리고 1 > 2 가 주어지는데 이때 1번은 4번 또는 3번과 경기가 없기 때문에 순위가 애매해진다. 그리고 2 >5 이기 때문에 정확하게 순위가 결정되는 사람은 [0,0,0,2,5] 가 된다. 따라서 2를 return 하면 된다.

 

코드에 설명이 많아서 그렇지 단순한 코드이다.

먼저 w, l 리스트는 집합을 요소로 갖는다.

그리고 results 를 돌면서 i번 선수를 이긴 선수들은 w[i], i번 선수에게 진 선수들은 l[i]에 전달한다.

이제 준비가 끝났으면 다시 반복문을 돌면서 w, l 을 정리해야 한다.

먼저 i번 선수에게 진 l[i] 에 담긴 선수들에게는 i 번 선수를 이긴 w[i] 를 추가해 준다.

그리고 마찬가지로 i번 선수를 이긴 w[i[ 선수들에게는 i번 선수에게 진 l[i]를 추가해준다.

이때 집합을 사용하였으므로 중복으로 전달되는 값들은 자동으로 무시가 된다.

 

그리고 이제 다시 1번부터 n 번 선수까지 반복문을 통해 돌면서 각 w[i], l[i] 합이 n -1 과 같은 경우만 찾으면 된다.

n = 6이라고 가정하면 1명의 선수는 5번을 경기를 가져야만 정확한 순위를 알 수 있다. 따라서 자기 자신을 제외한 n -1 값이 w[i]와 l[i]의 길이 합과 같은경우에만 순위가 결정된다.