풀이 과정
- 이전 챌린지에서 다른 사람들의 풀이를 보니, 컴프리헨션과 리스트의 함수들을 사용하는 모습을 보고, 소스가 훨씬 깔끔해 보이고 좋아보여서 최대한 사용해 보려고 해봄.
- 최종적으로 목표는 리스트에 [승률, 몸무게가 무거운 복서를 이긴 횟수, 몸무게, 번호] 요소를 삽입하는것이 목적임.
- 정렬은 마지막에 리스트의 sort 함수를 사용할 예정
- 따라서, 각 인원에 대해서 조사
- 인원의 승률을 구할 때는, 한번도 붙어보지 않은 경우에는 0, 한번이라도 붙어본 경우에는 W의 개수 / (W의 개수 + L의 개수)
- 몸무게가 무거운 복서를 이긴 횟수를 구할 때는, 상대가 나보다 무거우면서 head2head의 값이 W인 개수를 구하면 된다.
- 마지막에 현재 인원의 몸무게와 번호를 뒤에 붙여서 최종 리스트에 넣어주면 된다.
- 최종 리스트 정렬
- 정렬을 할 때, 승률로는 내림차순, 무거운 복서 이긴 횟수로 내림차순, 몸무게로 내림차순, 번호로 오름차순 순으로 정렬한다.
- 파이썬에서 오름차순의 경우는 그냥 써주면 되지만, 내림차순의 경우는 약간의 꼼수로 -를 붙여주면 된다.
- 번호만 따로 뽑아서 answer에 저장한 후 리턴해주면 된다.
소스 코드
def solution(weights, head2head):
# [승률, 몸무게가 무거운 복서를 이긴 횟수, 몸무게, 번호]
answer = []
people_count = len(weights)
result = []
for i in range(people_count):
if head2head[i].count('N') == len(head2head[i]):
winrate = 0
else:
winrate = head2head[i].count('W') / (head2head[i].count('W') + head2head[i].count('L'))
heavy_win_count = len([1 for j in range(people_count) if weights[i] < weights[j] and head2head[i][j] == 'W'])
result.append([winrate, heavy_win_count, weights[i], i+1])
result.sort(key=lambda x:(-x[0], -x[1], -x[2], x[3]))
for _, __, ___, n in result:
answer.append(n)
return answer
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'알고리즘[Python] > 프로그래머스' 카테고리의 다른 글
[ Lv 2 ] [ BFS ] 카카오프렌즈 컬러링북 (0) | 2021.09.10 |
---|---|
[ 위클리 챌린지 ] [ 3주차 ] 퍼즐 조각 채우기 (0) | 2021.09.10 |
[ 위클리 챌린지 ] [ 5주차 ] 모음 사전 (0) | 2021.09.03 |
[ 위클리 챌린지 ] [ 4주차 ] 직업군 추천하기 (0) | 2021.08.24 |
[ 위클리 챌린지 ] [ 2주차 ] 상호 평가 (0) | 2021.08.19 |