복서 정렬하기
1. 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/85002
2. 문제풀이 코드 & 해설
- 내 문제풀이 코드
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]
→ 해설 :
- 승률을 구하기 위해서는, 각 사람별로 전체 싸운 횟수 ("W"가 있는경우, "L"이 있는경우)를 구하고, 이긴 횟수("W")가 있는 경우 를 구한다.
- 무거운 사람을 이긴 횟수를 구하기 위해서는, (이긴 경우 and 상대의 무게가 본인보다 무거운 경우)를 구한다.
- 승률, 무거운사람 이긴 횟수, 몸무게, 자신의 인덱스를 합쳐서 객체로 변경한다. 이후에 각 데이터를 리스트에 집어넣는다.
- 우선순위가 승률(큰) > 무거운사람 이긴 횟수(큰) > 본인무게(큰) > 인덱스(작은) 이므로, 이 순서의 거꾸로 정렬한다.
- 리스트 내의 데이터의 인덱스 값을 리스트로 변경해서 반환한다.
→ 헤맨 case : 승률을 100 * 이긴횟수 // 전체싸움횟수로 만들었더니, 승률에 차이가 발생하는데 미묘한 차이를 구분하지 못해서 헤매었다. 연산을 할때는 조심 또 조심하자.
- Best 문제풀이 코드1 - 배춘익
→ 해설 :
1. 대단한 한줄 풀이!
2. 정렬이 필요한 값들에 "데이터"를 넣고 정렬을 돌리는 것이 아니라, 몸무게/이긴횟수/승률 등 요소들에 대해서, 각각에 대해 정렬을 시킨 후에, enumerate()를 돌려서 각자의 순위를 데이터에 집어넣었다.
- Best 문제풀이 코드2 - jehyuck
-> 남의코드를 붙여넣기 할순 없어서 생략.
→ 해설 :
- 딕셔너리가 아닌 리스트 형태로 만들는데, 이게 더 훌륭한듯.
- 처음부터 0이나 빈 데이터가 들어있는 전체 배열을 만들어놓고 시작해서, append()없이 예쁘게 데이터를 만들었다.
3. TIL
-
lambda 함수에서 여러 요소를 원하는 순서대로 정렬할 수 있다는 것을 알게 되었다.
→ 배열.sort(key = lambda x : ( x[0], -x[1] , x[2]))
—> lambda x : 이후에 튜플을 집어넣으면, 튜플의 마지막 요소 → 처음 요소 의 순서대로 정렬을 진행한다. 만약 "-"를 넣으면 reverse=True 형태로 배열한다.
-
리스트 내에 또 리스트 혹은 튜플이 있는 상태에서 sort() 함수를 돌리면 자동으로 내부 리스트의 각 데이터들을 기준으로 여러번 정렬이 돌아간다는 것을 알 수 있었다.
-
연산을 할 때 "//"를 함부로 쓰면 안된다.
4. TMI
처음으로 100등 안에 완료 해봐서 남들이 글 올리기 전에 빨리 올려봤다.
Author And Source
이 문제에 관하여(복서 정렬하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nzlk112/복서-정렬하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)