본문 바로가기

TLI/코드카타

2024.06.04 TIL 코트카타 72번(달리기 경주)

    fun solution(players: Array<String>, callings: Array<String>): Array<String> {
        val playerToRank = mutableMapOf<String, Int>()
        val rankToPlayer = mutableMapOf<Int, String>()

        for(playersIndex in players.indices) {
            playerToRank[players[playersIndex]] = playersIndex
            rankToPlayer[playersIndex] = players[playersIndex]
        }

        for(calling in callings) {
            val callingPlayerRank = playerToRank[calling]!!
            playerToRank[calling] = callingPlayerRank - 1

            val beforePlayer = rankToPlayer[callingPlayerRank - 1]!!
            playerToRank[beforePlayer] = callingPlayerRank

            rankToPlayer[callingPlayerRank-1] = calling
            rankToPlayer[callingPlayerRank] = beforePlayer
        }

        val answer = Array(players.size) {""}
        val playerIterator = rankToPlayer.entries.iterator()
        while (playerIterator.hasNext()) {
            val player = playerIterator.next()
            answer[player.key] = player.value
        }

        return answer
    }

 

풀이 과정

1. map 2개 생성

   - playerToRank(key:player / value:rank)

   - rankToPlayer(key:rank / value:player)

2. 호출된 이름(calling)된 선수의 rank확인

3. map (rankToPlayer) 에서 rank-1 값으로 앞에 있는 선수 이름 확인

4. 두 선수의 rank 갱신(두 map 모두)

5. 최종 결과물을 iterator로 배열에 초기화

 

포인트

- map을 두 개 써서 선수로부터 rank, rank로부터 선수를 한 번에 접근해서 정보를 업데이트 하는 것