https://programmers.co.kr/learn/courses/30/lessons/85002
def solution(wei, h2h):
l = len(wei)
win = [0]*l
w2H = [0]*l
for i in range(l) :
# 승률에 대해서
total = h2h[i].count("W") + h2h[i].count("L")
win[i] = h2h[i].count("W")/total if total else 0
# 무거운사람 이긴 횟수
for j in range(l) :
if wei[i] < wei[j] and h2h[i][j] == "W" :
w2H[i] += 1
dicts = []
for i in range(l) :
dicts.append({"index": i, "weight" : wei[i], "win" : win[i], "win_heavy" :w2H[i]})
dicts.sort(key= lambda x : (-x["win"], -x["win_heavy"], -x["weight"]))
return [x["index"]+1 for x in dicts]
→ 해설 :
→ 헤맨 case : 승률을 100 * 이긴횟수 // 전체싸움횟수로 만들었더니, 승률에 차이가 발생하는데 미묘한 차이를 구분하지 못해서 헤매었다. 연산을 할때는 조심 또 조심하자.
→ 해설 :
1. 대단한 한줄 풀이!
2. 정렬이 필요한 값들에 "데이터"를 넣고 정렬을 돌리는 것이 아니라, 몸무게/이긴횟수/승률 등 요소들에 대해서, 각각에 대해 정렬을 시킨 후에, enumerate()를 돌려서 각자의 순위를 데이터에 집어넣었다.
→ 해설 :
lambda 함수에서 여러 요소를 원하는 순서대로 정렬할 수 있다는 것을 알게 되었다.
→ 배열.sort(key = lambda x : ( x[0], -x[1] , x[2]))
—> lambda x : 이후에 튜플을 집어넣으면, 튜플의 마지막 요소 → 처음 요소 의 순서대로 정렬을 진행한다. 만약 "-"를 넣으면 reverse=True 형태로 배열한다.
리스트 내에 또 리스트 혹은 튜플이 있는 상태에서 sort() 함수를 돌리면 자동으로 내부 리스트의 각 데이터들을 기준으로 여러번 정렬이 돌아간다는 것을 알 수 있었다.
연산을 할 때 "//"를 함부로 쓰면 안된다.
처음으로 100등 안에 완료 해봐서 남들이 글 올리기 전에 빨리 올려봤다.