본문 바로가기

알고리즘(w.KOTLIN)/자료구조

[프로그래머스][Level1][178871] 달리기 경주

728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이

1. 주어진 callings, players 배열을 indexOf 를 이용하여 위치를 찾아 서로 swap 을 하게 되면 시간 초과 오류가 발생한다.

2. map 의 containsKey 를 이용하여 시간초과를 해결한다.

3. 이때 (Int, String) = (순위, 선수 이름) 을 가지는 map1과 (String, Int) = (선수 이름, 순위) 을 가지는 map2 를 선언한다.

4. callings 배열을 탐색한다.

5. 현재의 calling 선수가 map2에 포함되어 있으면 calling 선수의 현재 등수를 확인한다.

6. calling 선수의 등수 - 1의 선수와 서로 swap 하여 map1, map2 에 저장한다.

7. callings 배열을 탐색 완료 한 후 map1 을 출력한다.

코드

class Solution {
    fun solution(players: Array<String>, callings: Array<String>): Array<String> {
        val map1 = mutableMapOf<Int, String>() // 순위, 이름으로 맵에 저장
        val map2 = mutableMapOf<String, Int>() // 이름, 순위로 맵에 저장

        players.forEachIndexed { index, player ->
            map1[index] = player
            map2[player] = index
        }

        callings.forEach {calling ->
            if (map2.containsKey(calling)) {
                // calling 의 등수 확인
                val grade: Int = map2[calling]!!
                //println("grade : $grade")

                // 이미 1등이면 순위를 바꾸지 않는다.
                if (grade != 0) {
                    val temp: String = map1[grade - 1]!!
                    map1[grade - 1] = calling
                    map1[grade] = temp

                    map2[calling] = grade - 1
                    map2[temp] = grade

                    //println("swap : ${map1[grade - 1]}, ${map1[grade]}")
                }
            }
        }

        //println(map1.values)
        return map1.values.toTypedArray()
    }
}
728x90