https://programmers.co.kr/learn/courses/30/lessons/85002
코딩테스트 연습 - 6주차_복서 정렬하기
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요
programmers.co.kr
문제 설명
복서 선수들의 몸무게 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'입니다.
입출력 예
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] |
입출력 예 설명
입출력 예 #1
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 |
vs 1번 | vs 2번 | vs 3번 | vs 4번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 몸무게 |
1번 | - | 패배 | 승리 | 패배 | 33.33% | 1회 | 50kg |
2번 | 승리 | - | 패배 | 패배 | 33.33% | 0회 | 82kg |
3번 | 패배 | 승리 | - | 승리 | 66.66% | 2회 | 75kg |
4번 | 승리 | 승리 | 패배 | - | 66.66% | 0회 | 120kg |
- 본문에 서술된 우선순위를 따라 [3,4,1,2] 를 return 합니다.
입출력 예 #2
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 |
vs 1번 | vs 2번 | vs 3번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 몸무게 |
1번 | - | 패배 | 승리 | 50% | 0회 | 145kg |
2번 | 승리 | - | 패배 | 50% | 1회 | 92kg |
3번 | 패배 | 승리 | - | 50% | 1회 | 86kg |
- 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다.
입출력 예 #3
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 |
vs 1번 | vs 2번 | vs 3번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 몸무게 |
1번 | - | - | - | 0% (무전적) | 0회 | 60kg |
2번 | - | - | - | 0% (무전적) | 0회 | 70kg |
3번 | - | - | - | 0% (무전적) | 0회 | 60kg |
- 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.
문제 풀이
1. Boxer 클래스를 생성한다.
1-1. 인덱스(index), 승률(winRate), 자기보다 무거운 복서를 이긴 횟수(moreHeavierCount), 몸무게(weight)를 가진 변수 및 생성자를 선언한다.
2. 자기보다 무거운 복서를 이긴 횟수를 구현하는 함수(getMoreHeavierCount)를 구현한다.
2-1. 자기보다 무거운 복서를 이긴 횟수를 모아 놓은 배열(count_Arr), 자기보다 무거운 복서를 이긴 횟수(count)를 선언한다.
2-2. 복서 선수들의 전적을 나타내는 배열(head2head)을 돌면서 자기보다 무거운 복서를 이긴 횟수를 구한다.
2-3. 자기보다 무거운 복서를 이긴 횟수를 모아 놓은 배열(count_Arr)을 return 한다.
3. 복서들의 정보를 구현하는 함수(getBoxer)를 구현한다.
3-1. 복서들의 정보를 모아 놓은 배열(boxer_list)를 선언한다.
3-2. 복서 선수들의 몸무게를 모아 놓은 배열(weights)와, 복서 선수들의 전적을 나타내는 배열(head2head)을 돌면서 복서들의 정보를 정의한다.
3-3. 복서들의 정보를 모아 놓은 배열(boxer_list)를 return 한다.
4. 우선순위에 따라 복서 선수들의 번호를 return 한다.
import Foundation
class Boxer {
var index: Int
var winRate: Double
var moreHeavierCount: Int
var weight: Int
init(index: Int, winRate: Double, moreHeavierCount: Int, weight: Int) {
self.index = index
self.winRate = winRate
self.moreHeavierCount = moreHeavierCount
self.weight = weight
}
}
func solution(_ weights:[Int], _ head2head:[String]) -> [Int] {
func getMoreHeavierCount() -> [Int]{
var count_Arr:[Int] = []
var count = 0
for (i, e) in head2head.enumerated() {
let tmpArr = e.map{String($0)}
count = 0
for (j, e) in tmpArr.enumerated() {
if e.elementsEqual("W") {
if weights[i] < weights [j] {
count += 1
}
}
}
count_Arr.append(count)
}
return count_Arr
}
func getBoxer() -> [Boxer] {
var boxer_list: [Boxer] = []
for (i,_) in weights.enumerated() {
var win_count = 0
var fight_count = 0
for char in head2head[i] {
let s = String(char)
if s.elementsEqual("W") {
win_count += 1
}
if !s.elementsEqual("N") {
fight_count += 1
}
}
var winRate:Double = 0.0
if fight_count == 0 {
winRate = 0.0
} else {
winRate = Double(win_count) / Double(fight_count)
}
boxer_list.append(Boxer(index: i+1,winRate: winRate, moreHeavierCount: moreHeavier_count[i], weight: weights[i]))
}
return boxer_list
}
let moreHeavier_count = getMoreHeavierCount()
let boxer_list:[Boxer] = getBoxer()
return boxer_list.sorted { b1, b2 in
if b1.winRate == b2.winRate {
if b1.moreHeavierCount == b2.moreHeavierCount {
if b1.weight == b2.weight {
return b1.index < b2.index
} else {
return b1.weight > b2.weight
}
} else {
return b1.moreHeavierCount > b2.moreHeavierCount
}
} else {
return b1.winRate > b2.winRate
}
}.map{$0.index}
}
'Algorithm' 카테고리의 다른 글
[프로그래머스] 최소직사각형 (0) | 2021.10.02 |
---|---|
[프로그래머스] 입실 퇴실 (0) | 2021.09.16 |
[프로그래머스] 예상 대진표 (0) | 2021.09.03 |
[프로그래머스] 모음 사전 (0) | 2021.08.30 |
[프로그래머스] 거리두기 확인하기 (0) | 2021.08.25 |