[프로그래머스(파이썬/Python)] 복서 정렬하기(위클리 챌린지 6주차)

kindof

·

2021. 9. 10. 16:22

https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

 

문제에서 요구한 4가지 기준값을 정확히 구하고 해당 기준에 따라 정렬을 수행하면 되는 문제입니다.

 

특히 이 문제에서는 주어진 weights 배열과 head2head배열 내 원소의 문자열 길이가 동일했기 때문에 인덱싱을 쉽게 할 수 있다는 이점이 있었습니다.

 

다만, 많은 기업의 코딩테스트 문제들과 마찬가지로 테스트케이스가 모두 통과해도 채점 케이스가 틀리는 함정(?)이 이 문제에도 존재했는데 바로 "승률과 승리를 한 횟수는 다르다는 것"입니다.

 

사실, 함정이 아니라 문제를 똑바로 이해했는지에 대한 실력이겠지만 이런 부분을 세세하게 체크하는 습관이 중요한 것 같습니다.

 

 

[풀이]

from collections import defaultdict
def solution(weights, head2head):
    info = defaultdict(list)
    length = len(weights)
    
    for i in range(length):
        # 자신의 몸무게
        myWeight = weights[i]
        fight = head2head[i]
        wins, overWeightWins, totalGames = 0, 0, 0
        for j in range(length):
            # 상대방의 몸무게
            yourWeight = weights[j]
            if i == j or fight[j] == "N": continue
            if fight[j] == "W":
                wins += 1
                if myWeight < yourWeight:
                    overWeightWins += 1
            totalGames += 1
            
        info[i+1].append(wins/totalGames) if totalGames > 0 else info[i+1].append(0)
        info[i+1].append(overWeightWins)
        info[i+1].append(myWeight)
        info[i+1].append(i+1)
    sortedList = sorted(info.values(), key = lambda x : (-x[0], -x[1], -x[2], x[3]))
    answer = [sortedList[idx][3] for idx in range(length)]
    return answer