본문 바로가기
#알고리즘 [Algorithm]/Problem

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

by cy_mos 2021. 9. 27.
반응형
카테고리 (Category) 작성 날짜 (Write Date) 최근 수정 날자 (Recent Write Date) 작성자 (Writer)
알고리즘 2021.09.27. 23:00:42 2021.09.27. 23:00:50 Dev.Yang

 

복서 선수들의 몸무게 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'입니다.

📄 Swift Source Code

더보기
SourceCode.swift
0.00MB
import Foundation

private typealias Attribute = (percentage: Float, upperWin: Int, weight: Int, win: Int)

/**
    - MARK:
        - 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
        - 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
        - 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
        - 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
*/
func solution(_ weights: [Int], _ head2head: [String]) -> [Int] {
    
    var player: [Int: Attribute] = [:]
    
    for (index, weight) in weights.enumerated() {
        player[index] = Attribute(Float.zero, Int.zero, weight, Int.zero)
    }
    
    // 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
    for (number, weight) in weights.enumerated() {
        
        var total: Int = Int.zero
        for index in head2head[number].indices where head2head[number][index] != "N" {
            
            total += 1
            
            // 플레이어가 게임에서 승리한 경우
            if head2head[number][index] == "W" {
                player[number]?.win += 1
                
                // 자신보다 무거운 복서를 이긴 경우
                let position = head2head[number].distance(from: head2head[number].startIndex, to: index)
                if weight < player[position]!.weight { player[number]?.upperWin += 1 }
            }
        }
        
        // 승률은 (플레이어 승리 횟수 / 총 게임 횟수) * 100
        let winCount: Int = player[number]?.win ?? Int.zero
        player[number]?.percentage = Float(winCount) / Float(total) * 100
    }
    
    return player.sorted {
        // 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다.
        if $0.value.percentage > $1.value.percentage { return true }
        else if $0.value.percentage < $1.value.percentage { return false }
        // 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
        else if $0.value.percentage == $1.value.percentage && $0.value.upperWin != $1.value.upperWin {
            return $0.value.upperWin > $1.value.upperWin
        }
        // 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
        else if $0.value.upperWin == $1.value.upperWin && $0.value.weight != $1.value.weight {
            return $0.value.weight > $1.value.weight
        }
        // 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
        else if $0.value.weight == $1.value.weight {
            return $0.key > $1.key
        } else { return false }
    }.compactMap { $0.key + 1 }
}

🚀 REFERENCE

 

코딩테스트 연습 - 6주차_복서 정렬하기

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

programmers.co.kr

 

GitHub - ChangYeop-Yang/Study-Algorithm: 수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를

수학과 컴퓨터 과학, 언어학 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 형태로 표현한 것을 말한다. 알고리즘은 연산, 데이터 진행 또는 자동화된

github.com

반응형

댓글