
https://school.programmers.co.kr/learn/courses/30/lessons/340211
어떤 물류 센터는 로봇을 이용한 자동 운송 시스템을 운영합니다. 운송 시스템이 작동하는 규칙은 다음과 같습니다.
이동 중 같은 좌표에 로봇이 2대 이상 모인다면 충돌할 가능성이 있는 위험 상황으로 판단합니다. 관리자인 당신은 현재 설정대로 로봇이 움직일 때 위험한 상황이 총 몇 번 일어나는지 알고 싶습니다. 만약 어떤 시간에 여러 좌표에서 위험 상황이 발생한다면 그 횟수를 모두 더합니다.
운송 포인트 n개의 좌표를 담은 2차원 정수 배열 points와 로봇 x대의 운송 경로를 담은 2차원 정수 배열 routes가 매개변수로 주어집니다. 이때 모든 로봇이 운송을 마칠 때까지 발생하는 위험한 상황의 횟수를 return 하도록 solution 함수를 완성해 주세요.
문제의 매개변수를 먼저 해석하면 밑과 같습니다.
각 로봇의 최단거리의 우선순위
1. 이동 거리가 최단거리
2. r이동 많은 순서
3. c이동 많은 순서
즉, 먼저 r을 이동하고, 다음으로 c의 차이 만큼 이동하면 됩니다.
그리고 이동한 배열을 기록해 충돌이 발생하는지 비교합니다.
function solution(points, routes) {
let answer = 0;
let maxIndex = -1;
// 각 최단 경로 보관
const routeList = [];
routes.forEach((route) => {
const startIndex = route.shift() - 1; // 시작 포인트, 배열의 index에 맞눠 -1 함
const records = [points[startIndex]]; // 이동 값 보관 배열
let i = 0;
while(route.length > i) {
const [x, y] = records.at(-1); // 출발 지점
const [tx, ty] = points[route[i] - 1]; // 목표 지점
// r을 먼저 이동
if (x !== tx) x > tx ? records.push([x - 1, y]) : records.push([x + 1, y])
// c를 이동
else if (y !== ty) y > ty ? records.push([x, y - 1]) : records.push([x, y + 1])
else i++;
}
maxIndex = records.length > maxIndex ? records.length : maxIndex;
routeList.push(records);
});
const len = routeList.length;
for (let i = 0; i < maxIndex; i++) {
const crushList = [];
for (let x = 0; x < len - 1; x++) {
for (let y = x + 1; y < len; y++) {
if (
// 값이 존재하면 비교
routeList[x][i] && routeList[y][i]
&& routeList[x][i][0] === routeList[y][i][0]
&& routeList[x][i][1] === routeList[y][i][1]
) {
const isDuplicate = crushList.some(
(point) =>
point[0] === routeList[x][i][0] && point[1]===routeList[y][i][1]
)
if (!isDuplicate) {
crushList.push([routeList[x][i][0], routeList[x][i][1]]);
answer++;
}
}
}
}
}
return answer;
}