복서 정렬하기

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]

→ 해설 :

  1. 승률을 구하기 위해서는, 각 사람별로 전체 싸운 횟수 ("W"가 있는경우, "L"이 있는경우)를 구하고, 이긴 횟수("W")가 있는 경우 를 구한다.
  2. 무거운 사람을 이긴 횟수를 구하기 위해서는, (이긴 경우 and 상대의 무게가 본인보다 무거운 경우)를 구한다.
  3. 승률, 무거운사람 이긴 횟수, 몸무게, 자신의 인덱스를 합쳐서 객체로 변경한다. 이후에 각 데이터를 리스트에 집어넣는다.
  4. 우선순위가 승률(큰) > 무거운사람 이긴 횟수(큰) > 본인무게(큰) > 인덱스(작은) 이므로, 이 순서의 거꾸로 정렬한다.
  5. 리스트 내의 데이터의 인덱스 값을 리스트로 변경해서 반환한다.

→ 헤맨 case : 승률을 100 * 이긴횟수 // 전체싸움횟수로 만들었더니, 승률에 차이가 발생하는데 미묘한 차이를 구분하지 못해서 헤매었다. 연산을 할때는 조심 또 조심하자.

  • Best 문제풀이 코드1 - 배춘익

→ 해설 :
1. 대단한 한줄 풀이!
2. 정렬이 필요한 값들에 "데이터"를 넣고 정렬을 돌리는 것이 아니라, 몸무게/이긴횟수/승률 등 요소들에 대해서, 각각에 대해 정렬을 시킨 후에, enumerate()를 돌려서 각자의 순위를 데이터에 집어넣었다.

  • Best 문제풀이 코드2 - jehyuck
    -> 남의코드를 붙여넣기 할순 없어서 생략.

→ 해설 :

  1. 딕셔너리가 아닌 리스트 형태로 만들는데, 이게 더 훌륭한듯.
  2. 처음부터 0이나 빈 데이터가 들어있는 전체 배열을 만들어놓고 시작해서, append()없이 예쁘게 데이터를 만들었다.

3. TIL

  1. lambda 함수에서 여러 요소를 원하는 순서대로 정렬할 수 있다는 것을 알게 되었다.

    → 배열.sort(key = lambda x : ( x[0], -x[1] , x[2]))

    —> lambda x : 이후에 튜플을 집어넣으면, 튜플의 마지막 요소 → 처음 요소 의 순서대로 정렬을 진행한다. 만약 "-"를 넣으면 reverse=True 형태로 배열한다.

  2. 리스트 내에 또 리스트 혹은 튜플이 있는 상태에서 sort() 함수를 돌리면 자동으로 내부 리스트의 각 데이터들을 기준으로 여러번 정렬이 돌아간다는 것을 알 수 있었다.

  3. 연산을 할 때 "//"를 함부로 쓰면 안된다.

4. TMI

처음으로 100등 안에 완료 해봐서 남들이 글 올리기 전에 빨리 올려봤다.

좋은 웹페이지 즐겨찾기