https://programmers.co.kr/learn/courses/30/lessons/85002
def solution(weights, head2head):
players = []
for index, (weight, log) in enumerate(zip(weights, head2head)):
players.append({
'number': index + 1,
'weight': weight,
'win_rate': log.count("W") / max(1, len(log) - log.count("N")) * 100,
'win_heavier': sum(result == "W" and weight < weights[i] for i, result in enumerate(log))
})
players.sort(key=lambda x: [-x['win_rate'], -x['win_heavier'], -x['weight']])
return [player['number'] for player in players]
Iterable
의 합을 반환하는 함수
이중 for문 돌면서 직접 조건에 해당하는 것을 1씩 증가하며 count 했는데..ㅎㅎ
굳이 그럴 필요가없었다,,! (이중for문 코드는 길어지니 생략)
#전
players.sort(key=lambda x: x['weight'], reverse=True)
players.sort(key=lambda x: x['win_heavier'], reverse=True)
players.sort(key=lambda x: x['win_rate'], reverse=True)
# 후
players.sort(key=lambda x: [-x['win_rate'], -x['win_heavier'], -x['weight']])
sort를 여러번 할 필요 없이 key를 위와 같이 설정해주면 원하는대로 정렬이 된다..
그동안 자바로 알고리즘 문제 풀었는데, 파이썬으로 알고리즘 문제풀어보니 너무 편하다.. enumerate
, zip
너무 편하고, 자바는 딕셔너리 형태의 자료구조 만드려면 맵을 이용해야 했었는데 파이썬에서는 훨씬 편해졌다.