프로그래머스 - 달리기 경주
part27. 달리기 경주
js ver 1.0
function solution(players, callings) {
    const playMap = players.reduce((obj, player, idx) => {
        obj[player] = idx;
        return obj;
    }, {});
    return callings.reduce((acc, player) => {
        const idx = playMap[player];
        const front = players[idx - 1];
        players[idx - 1] = player;
        players[idx] = front;
        playMap[player] -= 1;
        playMap[front] += 1;
        return players;
    }, players);
}

js ver 1.1
function solution(players, callings) {
    const playInfo = players.reduce((obj, player, idx) => {
        obj[player] = {
            rank: idx + 1,
            front: players[idx - 1] ?? '',
            back: players[idx + 1] ?? '',
        };
        return obj;
    }, {})
    callings.forEach(name => {
        const {front, back} = playInfo[name];
        const fof = playInfo[front].front;
        playInfo[name].front = fof;
        playInfo[name].back = front;
        playInfo[front].front = name;
        playInfo[front].back = back;
        if (back) playInfo[back].front = front;
        if (fof) playInfo[fof].back = name;
        playInfo[name].rank -= 1;
        playInfo[front].rank += 1;
    })
    return Object.keys(playInfo).sort((p1, p2) => playInfo[p1].rank - playInfo[p2].rank);
}
