과제하는데 TLE 시간 초과 뜨는데, 코드 함 봐줄 수 있나요 ㅎ 해결되면 작게 사례하겠습니당
import bisect
import sys
class Leaderboard:
def __init__(self):
self.player_scores = {}
self.score_to_players = {}
self.sorted_scores = []
def _remove_score(self, player_id, old_score):
players = self.score_to_players[old_score]
players.remove(player_id)
if not players:
del self.score_to_players[old_score]
idx = bisect.bisect_left(self.sorted_scores, old_score)
if idx < len(self.sorted_scores) and self.sorted_scores[idx] == old_score:
self.sorted_scores.pop(idx)
def _add_score(self, player_id, score):
if score not in self.score_to_players:
self.score_to_players[score] = set()
bisect.insort(self.sorted_scores, score)
self.score_to_players[score].add(player_id)
def add_score(self, player_id, score):
if player_id in self.player_scores:
old_score = self.player_scores[player_id]
if score <= old_score:
return self.get_rank(player_id)
self._remove_score(player_id, old_score)
self.player_scores[player_id] = score
self._add_score(player_id, score)
return self.get_rank(player_id)
def get_rank(self, player_id):
if player_id not in self.player_scores:
return -1
score = self.player_scores[player_id]
cnt = 1
# 높은 점수부터 (내림차순)
for s in reversed(self.sorted_scores):
if s > score:
cnt += len(self.score_to_players[s])
else:
break
return cnt
def get_score_by_rank(self, rank):
if rank < 1:
return -1
count = 0
for s in reversed(self.sorted_scores):
n = len(self.score_to_players[s])
if count + n >= rank:
return s
count += n
return -1
# 예시 사용법
if __name__ == '__main__':
leaderboard = Leaderboard()
for line in sys.stdin:
line = line.strip()
if not line:
continue
parts = line.split()
cmd = parts[0]
if cmd == 'add_score':
player_id = int(parts[1])
score = int(parts[2])
print(leaderboard.add_score(player_id, score))
elif cmd == 'get_rank':
player_id = int(parts[1])
print(leaderboard.get_rank(player_id))
elif cmd == 'get_score_by_rank':
rank = int(parts[1])
print(leaderboard.get_score_by_rank(rank))
댓글 0