[Lv.1] 달리기 경주

01수정·2023년 11월 10일
0

문제



풀이

1) 무식한 방법이라고 생각은 했지만.. 시간초과로 오답이라니.

function solution(players, callings) {
    callings.forEach((name) => {
        let index = players.indexOf(name);
        players[index] = players[index-1];
        players[index-1] = name;
    })
    return players;
}

2) 시간을 어떻게 단축할지 몰라서 다른 분 포스트를 참고하였다.
indexOf 로 접근해서 시간이 많이 걸린 것이라고 한다. => O(N^2)
key 로 접근해야 O(1) 이므로 index 를 따로 뽑아 저장하여 이를 활용하기로 하였다.
https://yong-nyong.tistory.com/50

function solution(players, callings) {
    // 선수 별 index 
    let p_idx = {};
    players.forEach((name, idx) => {p_idx[name] = idx});

    callings.forEach((name, idx) => {
        let initial_idx = p_idx[name];             // 추월자의 원래 순서
        let front_player = players[initial_idx-1]; // 추월할 선수

        // players 변경
        players[initial_idx-1] = players[initial_idx]; 
        players[initial_idx] = front_player;

        // p_idx 도 그에 맞게 변경
        p_idx[name]--;
        p_idx[front_player]++;        
    });

    return players;
}

다른 풀이

function solution(players, callings) {
    const rank = {};
    players.forEach((c,i) => rank[c] = i);
    for(const winner of callings){
        let winnerI = rank[winner];
        let loserI = winnerI - 1;

        rank[winner]--;
        rank[players[loserI]]++;

        players[winnerI] = players[loserI];
        players[loserI] = winner;
    }
    return players;
}
profile
새싹 FE 개발자

0개의 댓글