function solution(players, callings) {
const keyPlayers = {}
// keyPlayer의 key는 player value는 rank
// keyRanks의 key는 rank value는 player
const keyRanks = {}
players.forEach((player,idx)=>{
const rank = idx+1
keyPlayers[player] = rank
keyRanks[rank] = player
})
callings.forEach((calling)=>{
// losePlayer는 calling된 선수의 바로 앞 순위인 플레이어
const losePlayer = keyRanks[keyPlayers[calling] - 1]
keyRanks[keyPlayers[calling]] = losePlayer // 호명된 선수 자리에 losePlayer가 들어감
keyRanks[keyPlayers[losePlayer]] = calling // 앞서고 있었던 선수 (losePlayer) 자리에 호명된 선수가 들어감
keyPlayers[calling] -= 1 // 호명된 선수의 순위는 1 증가
keyPlayers[losePlayer] += 1 // 앞서고 있었던 선수 (losePlayer)의 순위는 1 낮아짐
})
return Object.values(keyRanks)
}
key를 선수, value를 순위로 갖는 객체와
key를 순위, value를 선수로 갖는 객체를 생성한다.
문제에 주어진 선수(player)배열을 선수, 순위 별로 객체에 추가한다.
players.forEach((player,idx)=>{
const rank = idx+1
keyPlayers[player] = rank
keyRanks[rank] = player
})
이 후 호명한 선수 배열 (calling)을 순회하면서, 선수들의 순위를 조정한다.
callings.forEach((calling)=>{
// losePlayer는 calling된 선수의 바로 앞 순위인 플레이어
const losePlayer = keyRanks[keyPlayers[calling] - 1]
keyRanks[keyPlayers[calling]] = losePlayer // 호명된 선수 자리에 losePlayer가 들어감
keyRanks[keyPlayers[losePlayer]] = calling // 앞서고 있었던 선수 (losePlayer) 자리에 호명된 선수가 들어감
keyPlayers[calling] -= 1 // 호명된 선수의 순위는 1 증가
keyPlayers[losePlayer] += 1 // 앞서고 있었던 선수 (losePlayer)의 순위는 1 낮아짐
})
losePlayer는 기존에 앞서고 있던 선수를 의미한다. (추월 당한 선수)
즉, 해설자가 호명한 선수의 바로 앞 선수이다. 따라서 다음 코드로 losePlayer를 구할 수 있다.
const losePlayer = keyRanks[keyPlayers[calling] - 1]
keyPlayers[calling]
은 호명한 선수의 Rank가 출력된다. -1을 하면 호명한 선수보다 한 순위 앞서고 있는 선수의 순위를 의미한다.
따라서
keyRanks[keyPlayers[calling] - 1]
는 방금 호명한 선수보다 한 랭크 앞서고 있는 Player를 나타낸다. (keyRanks는 value가 Player)
losePlayer를 구하면 이제 객체에서 자리 바꾸기 작업을 시작한다.
keyRanks[keyPlayers[calling]] = losePlayer
keyRanks[keyPlayers[losePlayer]] = calling
keyPlayers[calling] -= 1
keyPlayers[losePlayer] += 1
객체를 정렬 한 후 순위를 key로, 선수 이름을 value로 가지는 객체를 배열로 바꾸어 리턴한다.
return Object.values(keyRanks)