🔥문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/340211
🔥풀이
각 로봇들이 0초일때, 1초일때, 2초 일때 .. n 초 일때 위치를 arr에 담았다.
예를들어 1번 로봇이 0 초일때 (1,1), 1초일때 (2,3), 2초일때 (3,3) 이라면 이를 [ [1,1], [2,3], [3,3] ] 로 기록하였다.
그러면 총로봇갯수만큼의 arr가 생성되고 각 arr의 index가 같고 동일한 위치에 있을 때를 포착하여 충돌횟수를 증가 시켰다.
function solution(points, routes) {
// 현재 row,column 와 타겟으로 포인트의 row와 column 넣으면
// 한칸 이동했을 때 좌표를 반환한다.
const getNextPosition =(r,c,targetR,targetC)=>{
if(r!==targetR) return r > targetR ? [r-1,c] : [r+1,c]
if(c!==targetC) return c > targetC ? [r,c-1] : [r,c+1]
return [r,c]
}
let arr = []
let maxIndex = 0
routes.forEach((route)=>{
let startPoint = route.shift()
let history =[points[startPoint-1]]
while(route.length){
let [nowR,nowC] = history.at(-1)
let [targetR,targetC] = points[route[0]-1]
let [nextR,nextC] = getNextPosition(nowR,nowC,targetR,targetC)
history.push([nextR,nextC])
if(nextR === targetR && nextC === targetC){
route.shift()
}
}
// 로봇들이 각자 이동하는 시간이 모두 다를 수 있으므로 최대로 걸리는 시간을 알아야함
maxIndex = Math.max(maxIndex,history.length-1)
arr.push(history)
})
let answer = 0
let index = 0
while(index<=maxIndex){
let crushPoints = []
for(let i=0; i<arr.length-1; i++){
for(let j=i+1; j<arr.length; j++){
if(
arr[i][index] && arr[j][index] &&
arr[i][index][0]===arr[j][index][0]
&& arr[i][index][1]===arr[j][index][1]
){
let alreadyInclude = crushPoints.some(
(point)=>point[0]===arr[i][index][0] && point[1]===arr[i][index][1]
)
if(!alreadyInclude){
crushPoints.push([arr[i][index][0],arr[i][index][1]])
++answer
}
}
}
}
++index
}
return answer
}
'알고리즘' 카테고리의 다른 글
백준[JS] > 1074번 Z (0) | 2024.10.28 |
---|---|
프로그래머스[JS] > [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 (1) | 2024.09.11 |
프로그래머스[JS] > 거스름돈 (2) | 2024.09.06 |
프로그래머스[JS] > 리코쳇 로봇 (0) | 2024.08.25 |
프로그래머스[JS] > 괄호 변환 ( 2020 KAKAO BLIND RECRUITMENT ) (0) | 2024.08.24 |