달리기 경주

해설자가 선수의 이름을 부를 때마다, 그 선수는 바로 앞에 있는 선수를 추월합니다. 처음 시작 순서는 'players' 배열로 주어지며, 해설자가 부른 선수들의 순서는 'callings' 배열에 담겨있습니다.

문제의 목표는 경주가 끝났을 때의 선수 순서를 반환하는 'solution' 함수를 완성하는 것입니다. 경주가 끝나면, 'solution' 함수는 선수들의 최종 순서를 'players' 배열 형태로 반환해야 합니다. 이 순서는 1등 선수부터 마지막 등수의 선수까지를 나타냅니다.

달리기 경주Lv.1

178871

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

해설

'players' 배열에 있는 플레이어들의 순서를 'callings' 배열에 있는 호출에 따라 바꾸는 기능을 합니다. 각 'calling'은 플레이어를 의미하며, 플레이어의 순서는 호출 순서대로 바뀝니다.

  • Name
    Map 객체 생성
    Type
    Description

    함수는 'players'의 각 요소(플레이어)에 인덱스를 맵핑하는 Map 객체 'result'를 생성합니다. 이로 인해 플레이어의 이름으로 그 플레이어의 현재 위치를 쉽게 찾을 수 있습니다.

  • Name
    'callings' 배열의 각 요소(호출)
    Type
    Description
    1. 현재 호출에 해당하는 플레이어의 위치('cur')를 가져옵니다.
    2. 'cur'가 0보다 크면(즉, 해당 플레이어가 배열의 첫 번째 위치에 있지 않으면), 해당 플레이어는 자신 앞의 플레이어('bPlayer')와 위치를 바꾸게 됩니다.
    3. 'result' 맵에도 새로운 위치 정보를 업데이트해 줍니다. 호출된 플레이어는 자신의 위치가 하나 앞으로 당겨지고('cur-1'), 자신 앞의 플레이어는 자신의 위치가 하나 뒤로 밀리게 됩니다('cur')
  • Name
    변경된 'players' 배열을 반환
    Type
    Description

    배열은 'callings' 배열의 호출 순서에 따라 플레이어들의 순서가 변경된 상태입니다.

달리기 경주

function solution(players, callings) {

  let result = new Map();

  for(let i = 0; i < players.length; i++){
    result.set(players[i], i);
  }

  for(let calling of callings){
    const cur = result.get(calling);

    if(cur > 0){
      const bPlayer = players[cur - 1];

      players[cur] = bPlayer; // 역전 당한 선수
      players[cur-1] = calling; // 현재 선수

      result.set(calling, cur-1); // 역전한 현재 선수의 키값은 -1해서 넣어주기
      result.set(bPlayer, cur); // 역전 당한 선수의 키값은 현재값으로,
    }
  }
  return players;
}