프로그래머스 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,000players[i]
는 i번째 선수의 이름을 의미합니다.players
의 원소들은 알파벳 소문자로만 이루어져 있습니다.players
에는 중복된 값이 들어가 있지 않습니다.- 3 ≤
players[i]
의 길이 ≤ 10
- 2 ≤
callings
의 길이 ≤ 1,000,000callings
는players
의 원소들로만 이루어져 있습니다.- 경주 진행중 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
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 문자열 다루기 기본 - Lv.1 (37) | 2023.08.10 |
---|---|
[프로그래머스] 수박수박수박수박수박수? - Lv.1 (27) | 2023.08.10 |
[프로그래머스] 신고 결과 받기 - Lv.1 (37) | 2023.08.08 |
[프로그래머스] 바탕화면 정리 - Lv.1 (43) | 2023.08.07 |
[프로그래머스] 공원 산책 - Lv.1 (16) | 2023.08.07 |