계발하는 개발자

[프로그래머스/Lv.1] 달리기 경주 본문

🖥 Computer Science/Algorithm

[프로그래머스/Lv.1] 달리기 경주

dev_genie 2023. 11. 25. 18:07

⚙️ 문제 설명


⚠️ 제한 사항


🔃 입출력


📜 입출력 예 설명


🧠 나의 풀이

// 1차 - 코드 통과했지만, 시간 초과로 제출시에는 실패
function solution(players, callings) {
    for(let i=0; i<callings.length; i++) {
        // 호출된 선수의 인덱스 찾기
        const callIndex = players.indexOf(callings[i]);
        
        // 1등 선수가 아닌 경우         
        if (callIndex > 0) {
            const temp = players[callIndex]; // kai
            players[callIndex] = players[callIndex - 1]; // poe
            players[callIndex - 1] = temp; // poe가 kai 자리로 이동
        }
    }
    return players;
}

// 2차
function solution(players, callings) {
    const playerObj = {};

    // 중복된 선수 이름을 처리하고 인덱스를 저장
    players.forEach((player, index) => {
        playerObj[player] = index;
    });

    callings.forEach(calling => {
        const callIndex = playerObj[calling];

        // 1등 선수가 아닌 경우         
        if (callIndex > 0) {
            const temp = players[callIndex]; // kai
            players[callIndex] = players[callIndex - 1]; // poe
            players[callIndex - 1] = temp; // poe가 kai 자리로 이동
            
            // 존재하지 않는 선수 이름 처리   
            playerObj[calling] = callIndex - 1; // 선수 위치 업데이트
            playerObj[players[callIndex]] = callIndex; // 이전 위치 업데이트
        }
    });

    return players;
}

 

🧐 풀이 설명

2차 식의 경우 1차 식과 다른 점은 players 배열 각 요소를 객체의 key로, 값을 index 로 저장하는 방식이다.

그런 후 callings 배열의 각 값과 일치하는 경우의 값을 callIndex에 저장하고,

players[callIndex] 값이 선언됐을 때가 앞 선수를 추월했을 때이므로, 배열 인덱스값을 조정해서 앞뒤 요소끼리 자리를 바뀌게 했다.

 

그리고 객체에 저장된 값이 players 배열을 참조했기 때문에, calling 값에 undefined가 들어가게 되는데

마찬가지로 호출된 선수와 이전 위치 선수의 인덱스를 서로 바꿔줘야 올바른 값을 참조할 수 있다. 

 

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/178871

LIST
profile

dev_genie

@dev_genie

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!