본문 바로가기

알고리즘/프로그래머스

위클리 챌린지 - 6주차_복서 정렬하기

https://programmers.co.kr/learn/courses/30/lessons/85002?language=swift 

 

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

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

programmers.co.kr

 

 

func solution(_ weights:[Int], _ head2head:[String]) -> [Int] {
    var results = [[Double]]()
    
    for i in 0 ..< weights.count {
        let result = head2head[i].map { $0 }
        // 경기 수
        var matchCount: Double = 0.0
        // 승 수
        var win: Double = 0.0
        // 자기보다 무거운 사람을 이긴 수
        var winFromHeavy = 0
        for j in 0 ..< weights.count {
            if i == j {
                continue
            } else {
                //경기 하지 않는 경우는 넘어감
                guard result[j] != "N" else { continue }
                // 이기거나 진 경우 경기 수를 1 증가
                matchCount += 1
                if result[j] == "W" {
                    //이긴 경우는 승 수 1 증가
                    win += 1

                    if weights[i] < weights[j] {
                        //만약 더 무거운 사람이라면 무거운 사람 이긴 수 1 증가
                        winFromHeavy += 1
                    }
                }
            }
        }
        var winRate: Double = 0.0

        if matchCount == 0.0 {
            winRate = 0.0
        } else {
            winRate = win / matchCount
        }
        let array: [Double] = [winRate, Double(winFromHeavy), Double(weights[i]), Double(i + 1)]

        /**
         // 승률, 무거운 사람을 이긴 승률, 무게, 번호
         // 문제에서 제시한 기준으로 정렬
         */
        results.append(array)
    }

    // 정렬 된 결과를 바탕으로 결과 도출
    results = results.sorted { first, second in
        if first[0] < second[0] {
            return false
        } else if first[0] == second[0] {
            if first[1] < second[1] {
                return false
            } else if first[1] == second[1] {
                if first[2] < second[2] {
                    return false
                } else if first[2] == second[2] {
                    if first[3] > second[3] {
                        return false
                    }
                }
            }
        }
        return true
    }

    return results.map{ Int($0[3]) }
}