less than 1 minute read

1. 개요

2. 풀이

```python def solution(score): # score를 합기준으로 내림차순으로 정렬한다. links = sorted(score, key=lambda link: sum(link), reverse=True) ranks, curRank, last = dict(), 1, 0

# score 배열의 원소에 해당하는 랭크를 저장할 ranks 선언
ranks[tuple(links[0])] = curRank

# links들중 하나씩 검사해서 이전 link합과 현재의 합이 같으면 랭크를 유지
# 다르면 링크의 인덱스를 활용해 랭크를 갱신한다.
for i in range(1, len(links)):
    if sum(links[i-1]) != sum(links[i]):
        curRank = i+1
    ranks[tuple(links[i])] = curRank

# 이제 ranks 사전을 통해 score를 모두 rank로 변환할수 있다.
return [ranks[tuple(s)] for s in score]

def solution(score): # 점수의합을 구해서 내림차순으로 정렬한다. a = sorted([sum(s) for s in score], reverse=True)

# 합에 대한 인덱스를 구할수 있는데
# 가장 낮은 인덱스를 구할수 있다. (O(N*N)) 그런데 score가 엄청 많으면 어떻게 할까
return [a.index(sum(s))+1 for s in score]

이진탐색을 통한 풀이

from bisect import bisect_right

def solution(score): # 이번에는 점수의합을 구해서 오름차순으로 정렬한다. a = sorted([sum(s) for s in score]) N = len(score)

# 이진탐색을 통해 upper_bound를 구한후 이값을 N에서 빼고 +1을 더하면 rank를 구할수 있다.
# 이러면 score의 갯수가 클때 빠르게 랭크를 구할수 있다. (O(NlogN))
return [N-bisect_right(a, sum(s))+1 for s in score]

Leave a comment