https://school.programmers.co.kr/learn/courses/30/lessons/178871
1번 풀이: 시간초과
// 젤 큰 문제 시간초과 (10^8 넘어가면 끝)
// const [key, value] map.entries()
// map사용해서 player찾음
// value값으로 object의 key찾기
// array로 풀면 시간초과
function solution(players, callings) {
var answer = [];
let temp = null;
for (const calling of callings) {
const index = players.indexOf(calling);
temp = players[index-1];
players[index-1] = calling;
players[index] = temp;
}
answer = players;
return answer;
}
2.
map을 배열로 변환: ...map이지 Obect.entries(), Object.values() 는 안 됨
배열.sort이지, map.sort은 안 됨
function solution(players, callings) {
var answer = [];
const map = new Map();
const map2 = new Map();
players.forEach((p, i) => {
map.set(p, i); // {name: rank}
map2.set(i, p); // {rank: name}
});
for (const calling of callings) {
const playerCurrRank = map.get(calling);
const otherPlayerName = map2.get(playerCurrRank - 1);
map.set(calling, playerCurrRank - 1); // 현재 선수 한 순위 앞으로 보내기
map.set(otherPlayerName, map.get(otherPlayerName) + 1); // 다른 선수 한 순위 뒤로 보내기
// map2도 업데이트하기
map2.set(playerCurrRank - 1, calling); // 앞순서에 현재선수 넣기
map2.set(playerCurrRank, otherPlayerName); // 현재 순서에 앞선수 넣기
}
for (const [key, value] of map.entries()) {
answer[value] = key;
}
return answer;
}
3.
function solution(players, callings) {
const nameObj = {};
players.forEach((p, i) => nameObj[p] = i);
for (const calling of callings) {
const idx1 = nameObj[calling]; // 현재선수의 랭킹
const name2 = players[idx1-1]; // 앞선수의 이름
// nameObj 업데이트
nameObj[calling] -= 1;
nameObj[name2] += 1;
// players 업데이트
players[idx1-1] = calling;
players[idx1] = name2;
}
return players;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스]둘만의 암호 (0) | 2023.05.27 |
---|---|
[프로그래머스] 공원산책 (0) | 2023.05.27 |
[프로그래머스] 완주하지 못한 선수 (0) | 2023.05.18 |
[프로그래머스] 폰켓몬 JS (0) | 2023.05.18 |
[프로그래머스] N개의 최소공배수 (유클리드 호제법) (0) | 2023.05.10 |