A^2 + B^2 = C^2
단 C가 가장 긴 변
윗 쿠션의 Y좌표 - A의 Y좌표
+ 윗 쿠션의 Y좌표 - [0]의 Y좌표
의 제곱과 [0]의 X좌표
- A의 X좌표
의 제곱을 더하면 파란선분
의 제곱 값을 알 수 있다. 즉 구하고자 하는 거리공끼리 벽에 닿기 전에 만나면 안된다.
점 A에 놓인 공을 왼쪽 방향으로 x축과 수평이 되도록 보내면 벽에 맞고 점 [1]에 닿아 이동 거리가 더 짧아보이지만, A가 벽으로 이동하는 경로에 점 [1]이 있으므로, 벽에 맞기전에 공에 먼저 맞게 됩니다.
function solution(m, n, startX, startY, balls) {
function nearestBoundaryDistance(targetCoords) {
const [targetX, targetY] = targetCoords
const left = startY === targetY && startX > targetX ? Number.MAX_SAFE_INTEGER : Math.pow(startX+targetX, 2) + Math.pow(startY-targetY, 2)
const right = startY === targetY && startX < targetX ? Number.MAX_SAFE_INTEGER : Math.pow((m-startX) + (m-targetX), 2) + Math.pow(startY-targetY, 2)
const top = startX === targetX && startY < targetY ? Number.MAX_SAFE_INTEGER : Math.pow((n-startY) + (n-targetY), 2) + Math.pow(startX-targetX, 2)
const bottom = startX === targetX && startY > targetY ? Number.MAX_SAFE_INTEGER : Math.pow(startY+targetY, 2) + Math.pow(startX-targetX, 2)
return Math.min(left,right,top,bottom)
}
return balls.map(nearestBoundaryDistance)
}