siino's 개발톡

달리기 경주 - 코틀린 본문

코딩테스트/프로그래머스

달리기 경주 - 코틀린

siino 2024. 2. 28. 21:45

요즘은 코틀린에 관심이 생겨 코틀린으로도 쉬운문제 위주로 차근차근 풀려고 노력중입니다 :)

우선 문제는 아래 링크에 첨부하겠습니다.

https://school.programmers.co.kr/learn/courses/30/lessons/178871

 

처음 문제를 해결하기 위해 생각했던건, calling에 들어있는 사람들의 이름을 indexOf함수로 해당 index를 찾아 그 앞 index와 자리를 바꾸도록 생각했습니다.

하지만 문제 조건에 의해 players의 길이는 최대 5만, calling의 길이는 최대 100만이기 때문에 calling의 모든 요소에 대해 indexOf를 수행한다면, 100만 * 5만 = 500억 만큼의 연산을 하게 됩니다.

 

따라서 보다 효율적인 방법을 생각하였고 Map을 통해 해결할 수 있음을 생각했습니다.

nameToRank라는 mutableMap으로 해당 K,V는 각각 String,Int타입을 갖게 선언하였고 해당 이름을 가진 선수의 현재 등수를 기록합니다. calling의 요소에 따라 nameToRank map에서 현재 등수를 찾고 바로 앞 등수의 사람과 자리를 바꿔준 후 map도 갱신을 시켜줍니다.

class Solution {
    fun solution(players: Array<String>, callings: Array<String>): Array<String> {
        var nameToRank: MutableMap<String, Int> = hashMapOf()
        players.forEachIndexed { index, player -> nameToRank[player] = index }
        callings.forEach {
            player -> var findIndex = nameToRank[player]!!
            var switchedPlayer = players[findIndex - 1]

            //원래 배열 자리바꾸기
            players[findIndex] = switchedPlayer
            players[findIndex - 1] = player

            //Map update
            nameToRank[player] = nameToRank[player]!! - 1
            nameToRank[switchedPlayer] = nameToRank[switchedPlayer]!! + 1
        }
        return players
    }
}