[문제 내용]
주어진 배열에서 순위를 매길 수 있는 선수의 수를 반환하라.
[example 1]
n | results | return |
---|---|---|
5 | [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] | 2 |
[해결 방법]
먼저 각 선수가 어떤 선수보다 순위가 높은지 저장할 map과
어떤 선수보다 순위가 낮은지 저장할 map을 만든다.
해당 map에 각 값들을 저장하고,
그 map을 이용해 각 선수 앞에 몇명이 있는지 세고,
각 선수 뒤에 몇명이 있는지 세서
그 합이 n-1이 된다면 그 선수는 순위를 매길 수 있는 사람이다.
class Solution {
var depth: Int = 0
fun solution(n: Int, results: Array<IntArray>): Int {
var answer = 0
val behind = HashMap<Int, MutableList<Int>>()
val front = HashMap<Int, MutableList<Int>>()
for(result in results) {
var counter = behind.getOrDefault(result[0], mutableListOf())
counter.add(result[1])
behind[result[0]] = counter
counter = front.getOrDefault(result[1], mutableListOf())
counter.add(result[0])
front[result[1]] = counter
}
for(i in 1..n) {
var sum = 0
findRanking(i, behind, BooleanArray(n+1){false})
sum += depth
depth = 0
findRanking(i, front, BooleanArray(n+1){false})
sum+= depth
depth = 0
if(sum == n-1) {
answer++
}
}
return answer
}
fun findRanking(start: Int, ranking: HashMap<Int, MutableList<Int>>, visited: BooleanArray) {
visited[start] = true
for(rank in ranking.getOrDefault(start, mutableListOf())) {
if(visited[rank]) {
continue
}
depth++
if(ranking.containsKey(rank)) {
findRanking(rank, ranking, visited)
} else {
visited[rank] = true
}
}
}
}