1. 당구를 친다고 가정했을 때 1곳의 벽에 무조건 닿은 후 공을 맞춰야 하므로 각각의 벽면까지 거리의 제곱을 구해보자.
2. 거리를 구하기 위해서는 (A - 벽까지의 거리 + 벽 - 도착점 까지 거리)를 이용 하는 방법도 있겠지만, A에서 치는 방향을 기준으로 도착점을 대칭 이동 시켜주면, 피타고라스의 정리에 의해 (A부터 도착점의 거리의 제곱)과 (A부터 벽까지의 수직거리 + 도착점의 벽까지의 수직거리 의 제곱)의 합으로도 정의 할 수 있다.
3. 흰공과 검은공이 동일 축 선상에 존재하는지 확인 후(같은 축에 있을 경우 쿠션 사용불가) 동일 선상에 있으면, 양수, 음수에 따라 쿠션을 칠 수 없는 부분을 제외한 나머지 값 중 최솟값을 반환하도록 구성하면 된다.
반응형
⚙ 내가 푼 정답 코드
class Solution {
public int[] solution(int m, int n, int startX, int startY, int[][] balls) {
int[] result = new int[balls.length];
for (int i = 0 ; i < balls.length; i++){
double x = startX-balls[i][0]; // X 거리
double y = startY-balls[i][1]; // Y 거리
double l = Math.pow((startX + balls[i][0]),2) + Math.pow(y,2); // 왼쪽까지 거리
double r = Math.pow((m - startX) + (m - balls[i][0]),2) + Math.pow(y,2); // 오른쪽 까지 거리
double d = Math.pow((startY + balls[i][1]),2) + Math.pow(x,2); // 아래쪽까지 거리
double t = Math.pow((n - startY) + (n - balls[i][1]),2) + Math.pow(x,2); // 위쪽까지 거리
result[i] = (int)Math.min(Math.min(l,r),Math.min(d,t));
if (x == 0){
if(y > 0){
result[i] = (int)Math.min(Math.min(l,r),t);
}
else{
result[i] = (int)Math.min(Math.min(l,r),d);
}
}
else if (y == 0){
if(x > 0){
result[i] = (int)Math.min(Math.min(d,t),r);
}
else{
result[i] = (int)Math.min(Math.min(d,t),l);
}
}
else{
result[i] = (int)Math.min(Math.min(l,r),Math.min(d,t));
}
}
return result;
}
}