[프로그래머스 자바스크립트] Lv.1 달리기 경주

전유정·2023년 4월 13일

프로그래머스

목록 보기
2/4

경영학과 학생에서 프론트엔드 개발자로..

작년 여름부터 해오던 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]);
}
profile
깨달음을 얻고 롱런하는 공간

0개의 댓글