(JS)프로그래머스 Lv.1 달리기경주

김진영·2023년 4월 15일
0

알고리즘

목록 보기
1/7
post-thumbnail

🍀 코드

function solution(players, callings) {
    // { 선수: 순위}
    let hash = new Map();
    players.forEach((player, idx) => hash.set(player, idx))
    
    callings.forEach(name => {
        const idx = hash.get(name);
        const front = players[idx - 1];
        [players[idx], players[idx - 1]] = [players[idx - 1], players[idx]];
        hash.set(front, idx);
        hash.set(name, idx - 1);
    })
    return players;
}

입력값의 제한은 다음과 같습니다.

  • 5 <= players 배열의 길이 <= 50,000
  • 2 <= callings 배열의 길이 <= 1,000,000

처음에는 callings 배열에 대해 forEach 메서드를 돌리고 이어서 players 배열에 대해 indexOf 메서드를 적용하는 식으로 풀이했습니다.
당연하게도 시간이 초과되었습니다. (1,000,000 * 50,000 > 100,000,000)
배열의 indexOf 메서드가 시간복잡도 O(n)라는 점을 간과했기 때문입니다.

시간초과 문제를 해결하기 위해 Map 자료형을 사용했습니다.

🍿 참고

두 값을 swap 하는 방법

구조 분해 할당을 이용할 수 있습니다.

const a = [1, 2, 3, 4];
[a[0], a[1]] = [a[1], a[0]];    // [2, 1, 3, 4]
profile
기록해서 남길래요

0개의 댓글