Kotlin
간단한 탐색 문제이다. stages
에는 user의 현재 위치가 주어진다. 만약 값이 2인 경우 현재 stage2 를 해결하지 못하고 있는 상태이다. 나는 아래와 같은 방법으로 해결했다.
stage 별로 count를 한다. 이후 저장된 count로 실패율을 계산한다.
해당 stage에서 대기하고 있는 유저가 없는 경우 실패율은 0.
해당 stage에서 대기하고 있는 유저가 있는 경우 실패율은 해당 stage 유저 / 전체 유저
.
따라서 stage 1부터 실패율을 계산하되 stage를 넘어갈 때마다 전체 유저 - 해당 stage 대기 유저 수
를 해준다.
위 과정이 종료되면 key : stage - value : ratio(실패율)
로 저장되어 있다. 이후 value의 내림차순으로 정렬하면 해결.
class Solution {
fun solution(N: Int, stages: IntArray): IntArray {
var answer = intArrayOf()
var onStage = mutableMapOf<Int, Int>()
var ratio = mutableMapOf<Int, Double>()
for (i in 1..N) {
onStage[i] = 0
}
for (e in stages.iterator()) {
if (e <= N) {
onStage[e] = onStage.getValue(e) + 1
}
}
for (i in 1..N) {
ratio[i] = 0.0
}
var total = stages.size
for (i in 1..N) {
if (onStage[i] != 0) {
ratio[i] = onStage.getValue(i) / total.toDouble()
total -= onStage.getValue(i)
}
}
var mapToList = ratio.toList()
mapToList = mapToList.sortedByDescending {it.second}
for (e in mapToList.iterator()) {
answer = answer.plus(e.first)
}
return answer
}
}
파이썬에 적응해버린 나 자신... 요런 구조의 map
사용이 익숙하지 않다. 더 열심히 연습해야겠다.
key에 새로운 value를 할당할 때는 key = value 가능하다. 하지만 value에 참조할 때는 map.getValue(key)
이런 식으로 접근해야한다. 주의!
C++이나 java와 마찬가지로 List<Pair<a, b>>
인 경우에 element.first
, element.second
이런 식으로 접근해야 한다. 역시 주의!! 이것도 역시 파이썬에 적응해버려서 이런 방법이 익숙치 않다.