기록하는삶
[코딩 문제 풀이(파이썬/Python)] 프로그래머스 _ 위클리 챌린지 6주차 _ 복서 정렬하기 본문
프로그래머스/프로그래머스_lv1(Python)
[코딩 문제 풀이(파이썬/Python)] 프로그래머스 _ 위클리 챌린지 6주차 _ 복서 정렬하기
mingchin 2021. 9. 13. 00:30728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/85002
[문제 설명]
복서 선수들의 몸무게 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'입니다.
# 승률 연산에 주의해야함
def solution(weights, head2head):
def weight(x):
cnt = 0
for i in range(len(weights)):
if i == x-1:
continue
elif (weights[x-1] < weights[i]) and (head2head[x-1][i]) == 'W':
cnt += 1
return cnt
def win_rate(x):
if head2head[x-1].count('N') == len(weights):
return 0
else:
return head2head[x-1].count('W') / (len(weights) - head2head[x-1].count('N'))
num =list(range(1, len(weights)+1))
# key값으로 주는 함수의 중첩
# 마지막 번호는 내림차순이 아니라 오름차순이므로, 음수화
num = sorted(num, key = lambda x: (win_rate(x),
weight(x), weights[x-1], -x), reverse = True)
return num
list.sort()가 각 원소가 리스트인 경우, 자동으로 요소의 순서대로 정렬함을 이용한 풀이도 있었다.
def solution(weights, head2head):
result = []
l = len(weights)
# 한 번에 정렬해서 풀어봅시다!
ans = [[0 for _ in range(4)] for _ in range(l)] # 승률, 무거운복서 이긴횟수, 자기 몸무게, 번호(음수로)
for i in range(l):
ans[i][2] = weights[i]
ans[i][3] = -(i+1)
cnt = 0 # 판수
for j in range(l):
if head2head[i][j] == 'W':
ans[i][0] += 1 # 일단 이김
cnt += 1
if weights[i] < weights[j]:
ans[i][1] += 1 # 무거운 복서 이김
elif head2head[i][j] == 'L':
cnt += 1 # 판수만 늘려준다
if cnt == 0:
ans[i][0] = 0
else:
ans[i][0] /= cnt
ans.sort(reverse=True) # 역순으로 정렬하면 모든 조건이 한 번에 정렬된다
for i in range(l):
result.append(-ans[i][3])
return result
그 예시는 다음과 같다.
알아두면 좋은 기능일 듯 하다.
728x90
반응형
'프로그래머스 > 프로그래머스_lv1(Python)' 카테고리의 다른 글
[코딩 문제 풀이(파이썬/Python)] 프로그래머스 _ 위클리챌린지 4주차 직업군 추천하기 (0) | 2021.09.13 |
---|---|
[코딩 문제 풀이(파이썬/Python)] 프로그래머스 _ 위클리챌린지 2주차 _ 상호평가 (0) | 2021.09.13 |
[코딩 문제 풀이(파이썬/Python)] 프로그래머스 _ 체육복 (0) | 2021.09.12 |
[코딩 테스트 연습(파이썬/Python)] 프로그래머스 _ 하샤드 수 (0) | 2021.09.12 |
[코딩 테스트 연습(파이썬/Python)] 프로그래머스 _ 콜라츠 추측 (0) | 2021.09.11 |