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);