[프로그래머스] 달리기 경주 (JS)

hhkim·2023년 7월 25일
0

Algorithm - JavaScript

목록 보기
75/188
post-thumbnail

풀이 과정

  1. 각 선수의 이름을 키, 인덱스를 값으로 하는 객체 만들기: forEach()
  2. callings 배열의 각 요소에 대해 반복: forEach()
  3. 선수 객체에서 현재 선수의 등수 찾기
  4. 3의 값을 가지고 players 배열에서 앞 선수의 이름 찾기
  5. 객체에서 두 선수의 등수 바꾸기
  6. 배열에서 두 선수의 자리 바꾸기

코드

function solution(players, callings) {
  const obj = {};
  players.forEach((player, i) => (obj[player] = i));
  callings.forEach((name) => {
    const i = obj[name];
    const prev = players[i - 1];
    [obj[prev], obj[name]] = [i, i - 1];
    [players[i - 1], players[i]] = [players[i], players[i - 1]];
  });
  return players;
}

🦾

처음에 간단하게 indexOf()로 이름 불린 선수의 인덱스를 탐색하는 코드를 썼는데 쓰면서도 이건 시간초과다... 하는 촉이 오긴 했다.
이런 감이 이제 온다는 게 좀 반가웠다.

역시나 시간 초과여서 다음 방법을 고민하는 데 시간이 좀 걸렸는데
1. 탐색 시간을 줄여서 O(1)로 하려면 객체를 만들어야지
2. 근데 이름이 키인가 등수가 키인가
3. 등수는 바뀌니까 이름이 키
4. 근데 그럼 나랑 자리 바꿀 선수의 이름을 또 O(n) 탐색으로 찾아야 하는 거 아냐?
5. 객체와 배열 모두를 스왑하자!
하는 의식의 흐름으로 문제를 해결할 수 있었다.

또 전에는 어려운 문제(그래도 이것보다 쉬운)를 1시간씩 고민하다가 결국 해결을 못해서 힌트를 봤는데 오늘은 처음 문제를 읽고 풀고 다시 개선하기를 완료하기까지 30분도 걸리지 않아서 뿌듯했다.
이건 물론 이 문제가 복잡한 로직이나 예외 처리가 필요없어서인 탓도 있긴 하겠지만...
무튼 아직 레벨 1 햇병아리라도 성장하는 병아리였다.

0개의 댓글