js 프로그래머스 달리기 경주

이명진·2023년 4월 7일
0

코드카타

목록 보기
64/69

문제 해석

달리기 경주가 열릴때 해설진들이 선수 이름을 외친다. 선수 이름을 외친이유는 그선수가 앞선수를 제쳤기 때문이다.
선수 이름을 부른 배열과 선수 배열이 주어질때 마지막 최종 순위를 리턴하면된다.

문제풀이

단순히 앞뒤를 바꿔주면 된다고 생각했다. splice를 사용해서 잘라주었다.

1차 코드


function solution(players, callings) {
    var answer = [];
    let res = players.slice(0);
    callings.forEach(x=>{
      let idx = res.indexOf(x);
      let player = res.splice(idx,1);
      res.splice(idx-1,0,player[0]);
      
    })
    console.log(res)
    return answer;
}

다 맞았지만 중간에 시간 초과가 떠버렸다
생각해보니 splice랑 indexOf가 성능상 안좋다는 이야기를 들었던게 생각이 났다.

어떻게 풀까 고민하다가 힌트를 찾게 되었다.

힌트는 객체를 활용하라는 것이었다. 일반 객체를. 활용해서 순위를 체크해서 마지막 값을 배열로 리턴 하라는 것.
new Map 함수와 일반 객체를 이용하면서 문제를 풀수 있었다.

new Map에 대해서 이전에 공부했었는데 여기서 써먹을수 있었다.

new Map

JavaScript의 Map은 키-값 쌍의 컬렉션

// 빈 Map 객체 생성
const myMap = new Map();

// 키-값 쌍 추가
myMap.set('key1', 'value1');
myMap.set('key2', 'value2');
myMap.set('key3', 'value3');

// 키-값 쌍 가져오기
console.log(myMap.get('key1')); // 출력 결과: "value1"

// 키-값 쌍 삭제
myMap.delete('key2');

// Map 객체에 키가 존재하는지 확인
console.log(myMap.has('key2')); // 출력 결과: false

// Map 객체의 크기 반환
console.log(myMap.size); // 출력 결과: 2

// Map 객체의 모든 키-값 쌍에 대해 반복
myMap.forEach((value, key) => {
  console.log(`${key} = ${value}`);
});
// 출력 결과:
// "key1 = value1"
// "key3 = value3"

이렇게 사용이 가능하다. 간단하게 객체로 만들어 준다.

그렇다면 일반 객체를 사용하면되지 왜 new map함수를 사용할까 궁금해졌다.

확인해보니 Map 객체는 키-값 쌍을 다루는 작업에 더욱 최적화되어 있다고 한다.
일반 객체는 키의 순서를 보장할수 없고 프로퍼티 개수를 직접 세어야 된다.
map객체는 순서를 보장할수 있고 size로 크기를 확인이 가능하다고 한다.

2차 풀이

function solution(players, callings) {
    var answer = [];
    const nameArr = {};
    const rankArr = {};
    players.forEach((x,i)=>{
      nameArr[x] = i
    })
    players.forEach((x,i)=>{
      rankArr[i]=x
    })

    callings.forEach(x=>{
      const winner = x;
      const winnerRank = nameArr[x]-1
      const loser = rankArr[winnerRank];
      const loserRank = nameArr[loser]+1;
  
      nameArr[winner] = winnerRank;
      nameArr[loser] = loserRank;
      rankArr[winnerRank] = winner;
      rankArr[loserRank] = loser;

    })
   for(let key in rankArr){
     answer[key*1]= rankArr[key]
   }
    return answer;
}

map을 사용할까 하다가 객체로 문제를 풀었다.

나중에 map객체를 활용해서 문제를 풀어야 겠다.

다른사람의 풀이

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개의 댓글