복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
weights | head2head | result |
---|---|---|
[50,82,75,120] | ["NLWL","WNLL","LWNW","WWLN"] | [3,4,1,2] |
[145,92,86] | ["NLW","WNL","LWN"] | [2,3,1] |
[60,70,60] | ["NNN","NNN","NNN"] | [2,1,3] |
def solution(weights, head2head):
victory=[]
# 승률 담기
for i in head2head:
cnt=0
N=0
for j in i:
if j == 'W':
cnt+=1
if j == 'N':
N+=1
# 경기를 한번도 하지 않을 경우 승률을 0으로
if N==len(i):
victory.append(0)
else:
victory.append(cnt/(len(i)-N))
win=[]
# 자기보다 무거운 복서 이긴 횟수 담기
for num, i in enumerate(head2head):
cnt=0
for num2,j in enumerate(i):
if j=='W' and weights[num]<weights[num2]:
cnt+=1
win.append(cnt)
result=list(zip(range(len(weights)),weights,head2head,victory,win))
result = sorted(result, key = lambda x : (-x[3], -x[4],-x[1],x[0]))
answer = []
for boxer in result:
answer.append(boxer[0]+1)
return answer
복서들의 번호, 몸무게, 승률, 자기보다 무거운 상대를 이긴 횟수를 담은 리스트에서 조건에 맞게 정렬시킨 후 번호를 출력해주도록 생각했다.
# 승률 담기
for i in head2head:
cnt=0
N=0
for j in i:
if j == 'W':
cnt+=1
if j == 'N':
N+=1
# 경기를 한번도 하지 않을 경우 승률을 0으로
if N==len(i):
victory.append(0)
else:
victory.append(cnt/(len(i)-N))
# 자기보다 무거운 복서 이긴 횟수 담기
for num, i in enumerate(head2head):
cnt=0
for num2,j in enumerate(i):
if j=='W' and weights[num]<weights[num2]:
cnt+=1
win.append(cnt)
result=list(zip(range(len(weights)),weights,head2head,victory,win))
result = sorted(result, key = lambda x : (-x[3], -x[4],-x[1],x[0]))
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
lambda를 쓰지 않고도 구할 수 있는 방법!
lambda를 언제 써볼까 하다가, 이 문제를 통해 제대로 개념을 이해하고 쓸 수 있었다!
출처: 프로그래머스
오류가 있으면 댓글 달아주세요🙂