[프로그래머스] 달리기 경주 - 178871(Java)

개발하는 파랑이·2024년 3월 13일

프로그래머스

목록 보기
2/5

<문제>

<입력>

  • 문자열 배열(players) - 선수들의 이름(1등부터 현재 등수 순서대로)
  • 문자열 배열(callings) - 해설진이 부른 이름

<출력>

  • 경주가 끝난 후 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return

    playerscallingsresult
    ["mumu", "soe", "poe", "kai", "mine"]["kai", "kai", "mine", "mine"]["mumu", "kai", "mine", "soe", "poe"]

<제한사항>

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

<풀이>

  • map사용
  • map은 인덱스 위치를 직접 변경하는 것이 아니라 value로 순위표시
  • 선수들 실제 인덱스 변경은 매개변수의 players[] 에서!
  1. map을 만들어(이름, 인덱스)로 삽입 - 1등은 어차피 불리지 않으니 0이어도 된다
  2. callings길이만큼 반복
    • map에서 callings 해당 선수의 순위(value)저장 - playerRank
    • 주어진 players의 playerRank-1 인덱스의 앞 선수 이름 저장 - front (map에서 찾기X, index가 순위X)
    • 1️⃣ map에서 앞선수의 위치 변경(value를 playerRank로)
    • 1️⃣ 주어진 players[playerRank]를 front이름으로 변경
    • 2️⃣ 현재 선수의 위치를 map에서 value를 playerRank-1로
    • 2️⃣ 주어진 players[playerRank-1] 이름을 현재 선수이름으로 변경
  • 1️⃣ - 앞선수를 뒤로
  • 2️⃣ - 현재 선수를 앞으로

=> 아래 전체코드를 설명, 주석과 함께 보면 이해가 잘될 것이다.

<전체코드>

import java.util.*;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        Map<String, Integer> rank = new HashMap<>();
        for(int i=0; i<players.length; i++) 
            rank.put(players[i],i);
        
        for(String player : callings) {
            int playerRank = rank.get(player); //선수의 현재 순위
            String front = players[playerRank-1]; //앞 선수 이름
            
            rank.replace(front, playerRank);//앞 선수의 위치 변경
            players[playerRank] = front;
            
            rank.replace(player, playerRank-1) ; //현재 선수의 순위를 앞으로 변경
            players[playerRank-1] = player;
        }
        return players;
    }
}
profile
이것저것 개발자

0개의 댓글