반응형
https://school.programmers.co.kr/learn/courses/30/lessons/169198
당구 연습 문제
당구를 쳤을때 굴러간 거리의 최솟값의 제곱을 반환하는 문제
#사용 알고리즘
구현
조건에 따른 분기
📌문제 접근 포인트
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;
}
}
반응형
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 혼자서 하는 틱택토(Java) (0) | 2024.04.12 |
---|---|
[프로그래머스] 도넛과 막대 그래프 (Java) (0) | 2024.04.12 |
[프로그래머스] 연속된 부분 수열의 합(Java) (2) | 2024.04.10 |
[프로그래머스] 리코쳇 로봇 (java) (0) | 2024.04.10 |
[프로그래머스] 인사고과(java) (0) | 2024.04.09 |
댓글