달리기 경주, Javascript

cptkuk91·2023년 4월 6일
1

Algorithm

목록 보기
157/161

문제

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

풀이

function solution(players, callings) {
    
    let result = new Map();
    
    for(let i = 0; i < players.length; i++){
        result.set(players[i], i);
    }
    
    for(let calling of callings){
        const cur = result.get(calling);
        
        if(cur > 0){
            const bPlayer = players[cur - 1];
            
            players[cur] = bPlayer; // 역전 당한 선수
            players[cur-1] = calling; // 현재 선수
            
            result.set(calling, cur-1); // 역전한 현재 선수의 키값은 -1해서 넣어주기
            result.set(bPlayer, cur); // 역전 당한 선수의 키값은 현재값으로,
        }
    }
    
    return players;
}

잘못된 풀이

처음에는 splice를 활용해 값을 옮긴 후, 중복된 값을 제거했다. 그러면 뒤에 있는 중복값이 제거된 상태에서 원하는 결과를 얻을 수 잇었다. 하지만, 제추 결과 시간 초과 문제가 발생 해 다른 풀이법을 생각해봤다.

풀이

우선 키값을 활용하기 위해 new Map()을 활용해, 이름과, 등수를 넣어줬다.
그럼 아래와 같은 결과를 얻을 수 있다.

Map(1) { 'mumu' => 0 }
Map(2) { 'mumu' => 0, 'soe' => 1 }
Map(3) { 'mumu' => 0, 'soe' => 1, 'poe' => 2 }
Map(4) { 'mumu' => 0, 'soe' => 1, 'poe' => 2, 'kai' => 3 }
Map(5) { 'mumu' => 0, 'soe' => 1, 'poe' => 2, 'kai' => 3, 'mine' => 4 }

현재 선수를 확인하기 위해 반복문을 활용했고, cur에다가 현재 등수의 상태를 넣어줬다.

const cur = result.get(calling);
console.log("calling", calling, cur);
// calling kai 3
// calling kai 2
// calling mine 4
// calling mine 3

cur값은 0보다 작을 수 없기 때문에 if(cur > 0)을 작성해줬고, 내 앞에 달리는 선수를 파악하기 위해 const bPlayer = players[cur-1]을 통해 전에 달리는 선수를 넣어줬다.

players[cur] = bPlayer // 역전 당했으니까 players[cur]로 옮겨줬고,
players[cur-1] = calling // 역전했으니까 역전한 선수를 넣어줬다.

result.set을 활용해 등수를 바꿔줬다.
순위가 1등 올라갔으니까, calling 값을 cur-1을 해서 앞자리로 옮겨주고,
역전 당한 선수는 역전 당했으니까, 값을 cur로 옮겨줬다. 결국에는 자리를 바꾼 것이다.

result.set(calling, cur-1); 
result.set(bplayer, cur);

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)

0개의 댓글