코딩테스트

[프로그래머스] 달리기 경주 - Lv.1

pyflu 2023. 8. 6. 17:27

프로그래머스 178871번 문제 "달리기 경주" Lv.1 - 파이썬, 자바, 코틀린

[프로그래머스] 달리기 경주 Lv.1 - [파이썬/python] [자바/java] [코틀린/kotlin]

 

 

프로그래머스 달리기 경주


💻 문제 설명

 

얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.

 

선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.

 


🚨 제한사항

 

  • 5 ≤ players의 길이 ≤ 50,000
    • players[i]는 i번째 선수의 이름을 의미합니다.
    • players의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • players에는 중복된 값이 들어가 있지 않습니다.
    • 3 ≤ players[i]의 길이 ≤ 10
  • 2 ≤ callings의 길이 ≤ 1,000,000
    • callingsplayers의 원소들로만 이루어져 있습니다.
    • 경주 진행중 1등인 선수의 이름은 불리지 않습니다.

 

 




!!!정답 주의!!!




 

 

 


🌟 소스 코드

[Python] 파이썬 코드

프로그래머스 달리기 경주 파이썬

def solution(players, callings):
   
    # 선수들의 초기 순위를 인덱스로 매핑한 딕셔너리 생성
    # {"mumu" : 0, "soe" : 1, "poe" : 2, "kai" : 3, "mine" : 4}
    players_ranking = {player: int(rank) for rank, player in enumerate(players)}

    for call in callings:
       
        current_rank = players_ranking[call]  # 호출된 선수의 현재 순위

        # {선수 : 순위} 딕셔너리에서 선수의 순위 바꿔주기
        players_ranking[call] -= 1
        players_ranking[players[current_rank - 1]] += 1

        # players 배열에서 선수들의 순위 바꿔주기
        players[current_rank - 1], players[current_rank] = call, players[current_rank - 1]

    return players

 

 

 

[Java] 자바 코드

프로그래머스 달리기 경주 자바

import java.util.HashMap;

class Solution {
    public String[] solution(String[] players, String[] callings) {

        // player의 등수를 바로 알기위한 HashMap
        // player : 등수
        HashMap<String, Integer> playerRanking = new HashMap<>();
        for(int i=0; i<players.length; i++){
            playerRanking.put(players[i], i);
        }

        // call할 때마다 player 순위 및 player 위치 바꿔주기
        for(String callPlayer : callings){

            // call한 player 등수 가져오기
            int callPlayerRanking = playerRanking.get(callPlayer);

            // call의 앞 등수 player 이름 가져오기
            String frontPlayer = players[callPlayerRanking - 1];

            // String[] players 위치 바꿔주기
            players[callPlayerRanking - 1] = callPlayer;
            players[callPlayerRanking] = frontPlayer;

            // HashMap<String, Integer> playerRanking 등수 바꿔주기
            playerRanking.put(callPlayer, callPlayerRanking - 1);
            playerRanking.put(frontPlayer, playerRanking.get(frontPlayer) + 1);
        }

        return players;
    }
}

 

 

 

[Kotlin] 코틀린

프로그래머스 달리기 경주 코틀린

class Solution {
    fun solution(players: Array<String>, callings: Array<String>): Array<String>{

        // Player와 Index를 매핑하는 Map 생성
        val playerToIndex = players.mapIndexed {index, player ->  player to index}.toMap().toMutableMap()

        // 호출된 선수들의 이름 순회
        for(calledPlayer in callings){

            // 호출된 선수의 Index 가져오기, NullPointerException 방지
            val calledPlayerIndex = playerToIndex[calledPlayer] ?: continue

            // 앞 선수 찾기
            val overTakenPlayer = players[calledPlayerIndex - 1]

            // 호출될 선수와 앞 선수 위치 교환
            players[calledPlayerIndex - 1] = calledPlayer
            players[calledPlayerIndex] = overTakenPlayer

            // Player의 Index 정보 업데이트(Map 업데이트)
            playerToIndex[overTakenPlayer] = calledPlayerIndex
            playerToIndex[calledPlayer] = calledPlayerIndex - 1
        }

        return players
    }
}

 


🏳‍🌈 테스트 결과

 

프로그래머스 달리기 경주

 

[Python] 파이썬 - 테스트 결과 [Java] 자바 - 테스트 결과
프로그래머스 달리기 경주 파이썬 결과
프로그래머스 달리기 경주 자바 결과
[Kotlin] 코틀린 - 테스트 결과  
프로그래머스 달리기 경주 코틀린 테스트 결과
 

 

728x90