[프로그래머스] 순위 정하기 - JS

Lenny·2023년 8월 24일
0

문제

풀이

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
  1. KeyRanks 객체에서 호명한 선수를 기존에 앞서고 있던 선수로 수정한다.
  2. keyRanks 객체에서 기존에 앞서고 있던 선수를 호명한 선수로 수정한다.
  3. keyPlayers 객체에서 호명한 선수의 순위를 -1 해준다. (순위 증가)
  4. keyPlayers 객체에서 기존에 앞서고 있던 선수의 순위를 +1 해준다. (순위 감소)

객체를 정렬 한 후 순위를 key로, 선수 이름을 value로 가지는 객체를 배열로 바꾸어 리턴한다.

return Object.values(keyRanks)
profile
🧑‍💻

0개의 댓글