반응형
카테고리 (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 함수를 완성해주세요.
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 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'입니다.
📄 Swift Source Code
더보기
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
반응형
'# 사용하지 않는 게시글 > 알고리즘 문제' 카테고리의 다른 글
[프로그래머스 - 구현] 행렬 테두리 회전하기 (0) | 2021.11.18 |
---|---|
[프로그래머스 - 구현] 신규 아이디 추천 (0) | 2021.10.06 |
[프로그래머스 - 자료구조] 직업군 추천하기 (0) | 2021.09.16 |
[프로그래머스 - 해시] 베스트앨범 (0) | 2021.05.10 |
[프로그래머스 - 탐색] 단어 변환 (0) | 2021.05.06 |
댓글