
<문제>
https://leetcode.com/problems/relative-ranks/
<풀이>
import heapq
class Solution:
def findRelativeRanks(self, score: List[int]) -> List[str]:
result = [None] * len(score)
heap = [-n for n in score]
heapq.heapify(heap)
for i in range(1, len(score)+1):
biggest = -heapq.heappop(heap)
idx = score.index(biggest)
if i == 1:
result[idx] = 'Gold Medal'
elif i == 2:
result[idx] = 'Silver Medal'
elif i == 3:
result[idx] = 'Bronze Medal'
else:
result[idx] = str(i)
return result
- 큰 숫자 순서대로 뽑는 것을 생각해서 heap 사용
- 리스트 변환 O(N), heapify O(N)
- heappop(heap) O(log N), index 찾는 부분 O(N) -> 반복문까지 O(N * (N + log N)) = O(N2)
- 전체 시간복잡도는 O(N2)
이번엔 해시테이블로 접근
class Solution:
def findRelativeRanks(self, score: List[int]) -> List[str]:
sorted_score = sorted(score, reverse=True)
rank_map = {val:i for i, val in enumerate(sorted_score)}
ans = []
for val in score:
rank = self.convert_rank(rank_map[val])
ans.append(rank)
return ans
def convert_rank(self, idx):
if idx == 0:
return "Gold Medal"
elif idx == 1:
return "Silver Medal"
elif idx == 2:
return "Bronze Medal"
else:
return str(idx + 1)
- sorted 내장함수 시간복잡도는 O(N log N)
- 해시테이블 만드는데 O(N)
- 전체 시간복잡도는 O(N log N)
- 훨씬 간단하면서 빠른 코드가 되었다
- 최소/최대값이라고 무작정 힙을 쓰지 말고 더 효율적인 방법이 있는지 생각해보자
'TIL > [파이썬] 1일 1코테' 카테고리의 다른 글
| 절댓값 힙_백준11286 (0) | 2025.02.13 |
|---|---|
| 크리스마스 선물_백준14235 (0) | 2025.02.12 |
| 더 맵게_프로그래머스 (1) | 2025.02.10 |
| 균형잡힌 세상_백준4949 (0) | 2025.02.08 |
| 식당메뉴_백준26043 (0) | 2025.02.06 |