[Python] 프로그래머스 - Weekly Challenge 6주차

728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/85002?language=python3 

 

코딩테스트 연습 - 6주차

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요

programmers.co.kr

 

 

def solution(weights, head2head):
    answer = []
    # WL = [[승리횟수, 자신보다 몸무게가 무거운 복서 이긴횟수], 복서번호]
    # 4번째 조건인 작은 번호가 앞에 오도록 하기위해 i+1(복서번호)을 넣어주었다.
    WL = [[[0, 0], i+1] for i in range(len(weights))]

    for h in range(len(head2head)):
        cnt = 0
        for idx, res in enumerate(head2head[h]):
            # 비겼으면 cnt 1증가
            if res == 'N':
                cnt += 1
            if res == 'W':
                # 현재 h번 복서가 idx번 복서를 이기고 몸무게가 작다면
                # 자신보다 몸무게가 무거운 복서를 이겼으므로 WL[h][0][0], WL[h][0][1] 둘다 1 증가
                if weights[idx] > weights[h]:
                    WL[h][0][0] += 1
                    WL[h][0][1] += 1
                else:
                    WL[h][0][0] += 1
        
        # cnt가 len(weights)와 같다면 모든 사람과 붙어본 적이 없으므로 WL[h][0][0] = 0
        # 안그러면 ZeroDivisionError가 뜬다.
        if cnt == len(weights):
            WL[h][0][0] = 0
        else:
            # 붙어본 사람이 1명이상이면 WL[h][0][0]에 승률을 넣어준다.
            # len(weights) 에서 붙어본적이 없는 횟수(cnt)를 빼주면 총 경기수
            # 승률 = 승리횟수 / 총 경기수
            WL[h][0][0] = WL[h][0][0] / (len(weights) - cnt)

    # WL을 정렬해준다. 정렬기준은 다음과 같다.
    # 1. -x[0][0] (승률기준으로 내림차순)
    # 2. -x[0][1](자신보다 몸무게가 무거운 복서 이긴횟수 내림차순)
    # 3. weights[x[1]-1] (복서들의 몸무게 내림차순)
    WL.sort(key = lambda x: (-x[0][0], -x[0][1], -weights[x[1]-1]))
    for i in WL:
        answer.append(i[1])
    return answer
728x90
반응형
TAGS.

Comments