[프로그래머스] 복서 정렬하기

chanyeong kim·2021년 9월 27일
0

프로그래머스

목록 보기
8/51

📩 -->문제설명

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

  1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
  2. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
  3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
  4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.

제한사항

  • 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'입니다.

입출력 예

weightshead2headresult
[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]

💡 solution(사용언어: python)

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))
  • 먼저 W일 때 cnt를 1 증가시켜주고, N일 때 1을 증가시켜 주었다.
  • cnt는 이긴횟수, N은 경기를 하지 않은 횟수
  • 승률은 이긴횟수 / 전체 경기 수
  • 여기서 경기 수는 전체에서 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)
  • 마찬가지로 자기보다 무거운 복서를 이긴 횟수를 Win에 담았다.
	result=list(zip(range(len(weights)),weights,head2head,victory,win))
    
    	
  • zip을 이용해서 무게, 전적, 승률, 자기보다 무거운 복서를 인긴 횟수, 번호를 튜플 형태로 result 리스트에 담았다.
	result = sorted(result, key = lambda x : (-x[3], -x[4],-x[1],x[0]))
  • -x[3]: 전체 승률이 높은 복서
  • -x[4]: 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서
  • -x[1]: 몸무게가 무거운 복서
  • x[0]: 작은 번호 순서
  • sorted와 lambda를 이용해서 조건을 만족시키도록 정렬한 후 return 해주면 끝!!

결과

다른 풀이

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를 언제 써볼까 하다가, 이 문제를 통해 제대로 개념을 이해하고 쓸 수 있었다!

출처: 프로그래머스

오류가 있으면 댓글 달아주세요🙂

0개의 댓글