경영학과 학생에서 프론트엔드 개발자로..
작년 여름부터 해오던 IT 연합 동아리에서 스터디와 프로젝트를 하면서,
프론트엔드 개발에 관심이 생기게 되었고, 개발자가 되고 싶었다.
현재는 휴학 후 3월부터 자바스크립트 공부를 해나가고 있고,
코딩 테스트 준비용으로 백준과 프로그래머스 중에서도 js를 지원하는 '프로그래머스' 플랫폼을 이용하고 있다.
Lv.1 문제를 매일 풀어보면서 스스로 리뷰하는 시간을 가질 예정이다 😳
얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.
선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.
내 풀이 (시간 초과)
생각나는 두 메서드로 구현했지만, 시간 초과로 실패했다.
indexOf: 문자열에서 특정 문자열을 찾고, 검색된 문자열이 '첫번째'로 나타나는 위치 index를 리턴하는 메서드.
splice: 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경하는 메서드
*splice의 매개변수들은 차례대로,
splice[ 배열 변경을 시작할 인덱스, 배열에서 제거할 요소의 수, 배열에 추가할 요소의 수] 로 이루어져 있다.
function solution(players, callings) {
var answer = [...players]
callings.forEach(i=>{
let index = answer.indexOf(i);
answer.splice(index-1,0,String(answer.splice(index,1)));
})
return answer;
}
구글링을 해보니 두 메서드가 성능이 좋지 않다는 것을 알게 되었다.
그럼 어떻게 해야 할까?
다른 풀이 (통과)
function solution(players, callings) {
let maps = {};
for(let i = 0; i < players.length; i++){
maps[players[i]] = i;
}
callings.forEach(v => {
let num = maps[v];
let temp = players[num-1];
players[num-1] = v;
players[num] = temp;
maps[v]--;
maps[players[num]]++;
})
return Object.entries(maps).sort((a,b) => a[1] - b[1]).map(v => v[0]);
}