문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모
indexOf()를 썼을 때 시간 초과가 떴다. indexOf()는 찾는 요소를 배열의 인덱스 0부터 차례대로 확인해나가기 때문에 대부분의 경우 상당한 시간을 요구하기 때문이다. 이를 대체하기 위한 수단으로 players를 객체 playersObj로 변형시켰다. 이때 key는 참가자 이름, value는 등수이다. 그리고 callings에 속한 참가자 이름을 playersObj에서 찾아 현재 등수를 찾고, players에서 현재 참가자 이름, 그 바로 앞 등수였던 참가자 이름을 교체한다. 또한 playersObj에서도 해당 두 참가자의 이름을 찾아 등수를 바꿔준다. 이 방법은 playersObj에 모든 참가자의 현재 등수를 단계적으로 저장함으로써 indexOf()의 방식처럼 인덱스 0부터 참가자 이름이나 등수를 찾을 필요가 없어 훨씬 빠르다.
정답
function solution(players, callings) {
let playersObj = {};
players.forEach((players, index) => {
playersObj[players] = index;
});
callings.forEach(calling => {
const callingIndex = playersObj[calling];
const tmp = players[callingIndex - 1];
players[callingIndex] = tmp;
players[callingIndex - 1] = calling;
const tmp2 = playersObj[tmp];
playersObj[tmp] = playersObj[calling];
playersObj[calling] = tmp2;
});
return players;
}