코딩 테스트/프로그래머스 코딩 테스트 연습

[JS] [PCCP 기출문제] 3번 충돌위험 찾기

58청춘 2024. 11. 5. 20:49
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/340211

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

풀이

이 문제의 경우 각 로봇이 움직이는 시간별로 위치를 객체에 담아 중복되는 경우를 탐지해야한다.

 

코드

function solution(points, routes) {
  let answer = 0;
  const map = new Map();
  const pos = [];
  points.forEach(([y, x], i) => {
    map.set(i + 1, [y, x]);
  });


  routes.forEach((e) => {
    let time = 0;
    let last = [0, 0];

    for (let i = 0; i < e.length - 1; i++) {
      let [sY, sX] = map.get(e[i]);
      let [eY, eX] = map.get(e[i + 1]);

      while (sY !== eY || sX !== eX) {

        if (!pos[time]) pos[time] = {};
        if (!pos[time][sY]) pos[time][sY] = {};
        pos[time][sY][sX] = (pos[time][sY][sX] || 0) + 1;

        if (pos[time][sY][sX] === 2) answer += 1;

        if (sY > eY) sY--;
        else if (sY < eY) sY++;
        else if (sX > eX) sX--;
        else if (sX < eX) sX++;

        last = [sY, sX];
        time++;
      }
    }
    if (!pos[time]) pos[time] = {};
    if (!pos[time][last[0]]) pos[time][last[0]] = {};
    pos[time][last[0]][last[1]] = (pos[time][last[0]][last[1]] || 0) + 1;

    if (pos[time][last[0]][last[1]] === 2) answer += 1;
  })
  return answer;
}
728x90