프로그래머스 - 순위(kotlin)

silver·2021년 8월 12일
0

[문제 내용]
주어진 배열에서 순위를 매길 수 있는 선수의 수를 반환하라.

  • results 배열 각 행 [A, B]는 A 선수가 B 선수를 이겼다는 의미

[example 1]

nresultsreturn
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
            }
        }
    }
}

0개의 댓글