여름의 서재
[프로그래머스] 위클리 챌린지_6주차_복서 정렬하기 본문
728x90
📕 문제
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
[제한사항]
- weights의 길이는 2 이상 1,000 이하입니다.
- weights의 모든 값은 45 이상 150 이하의 정수입니다.
- weights[i] 는 i+1번 복서의 몸무게(kg)를 의미합니다.
- head2head의 길이는 weights의 길이와 같습니다.
- head2head의 모든 문자열은 길이가 weights의 길이와 동일하며, 'N', 'W', 'L'로 이루어진 문자열입니다.
- head2head[i] 는 i+1번 복서의 전적을 의미하며, head2head[i][j]는 i+1번 복서와 j+1번 복서의 매치 결과를 의미합니다.
- 'N' (None)은 두 복서가 아직 붙어본 적이 없음을 의미합니다.
- 'W' (Win)는 i+1번 복서가 j+1번 복서를 이겼음을 의미합니다.
- 'L' (Lose)는 i+1번 복사가 j+1번 복서에게 졌음을 의미합니다.
- 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'W' 이면, head2head[j][i] = 'L'입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'L' 이면, head2head[j][i] = 'W'입니다.
- 임의의 i, j에 대해서 head2head[i][j] = 'N' 이면, head2head[j][i] = 'N'입니다.
💡 풀이법
: 사실 이번 문제는 문제의 설명 순서대로 구현만 해주면 되는 문제였다! 매우 심플😀
1. weights와 head2head를 처음부터 돌면서 각 선수들의 승률, 자신보다 무거운 선수를 이긴 횟수, 몸무게, 번호를 튜플로 묶어서 리스트에 넣으면 된다.
2. 여기서 승률은 이긴횟수/싸운횟수 이므로 -> 승률 = 'W'의 갯수/(전체 선수의 수-'N'의 갯수) 이다.
(이때, 아예 안싸운 선수가 있을수도 있다. 그렇게 되면 0으로 나누게 될수도 있기 때문에 경우의 수를 나누어 줘야한다.
3. 모든 선수의 정보가 담긴 리스트를 sorted함수를 이용해서 4개의 조건으로 정렬시켜준다.
def solution(weights, head2head):
win = []
n = len(weights)
for i in range(n):
cnt = 0 # 자신보다 무거운 선수를 이긴 횟수를 구해줄 for문
for j in range(n):
if head2head[i][j] == 'W' and weights[i] < weights[j]:
cnt += 1
fight = n - head2head[i].count('N') # 승률
if fight:
win_rate = head2head[i].count('W')/fight*100
else: # 싸운 횟수가 0일 겨우
win_rate = 0
win.append((win_rate, cnt, weights[i], i))
win = sorted(win, key=lambda x:(-x[0],-x[1],-x[2],x[3]))
answer = [i[3]+1 for i in win]
return answer
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 2021 KAKAO BLIND RECRUITMENT_메뉴 리뉴얼 (0) | 2021.09.11 |
---|---|
[프로그래머스] 2021 KAKAO BLIND RECRUITMENT_신규 아이디 추천 (0) | 2021.09.11 |
[프로그래머스] 위클리 챌린지_5주차_모음사전 (0) | 2021.09.07 |
[프로그래머스] 2020 카카오 인턴쉽_키패드 누르기 (0) | 2021.09.07 |
[프로그래머스] 위클리 챌린지_4주차_직업군 추천하기 (0) | 2021.08.25 |
Comments