문제
https://school.programmers.co.kr/learn/courses/30/lessons/169198?language=java#
풀이
오른쪽 벽 기준으로 원쿠션이 된다고 가정할 때 공의 이동거리(빨간색 점선)는
(3,7)을 오른쪽 벽 기준으로 점 대칭한 (17,7)과 (7,3)사이의 거리와 같으므로 상,하,좌,우로 쿠션을 주었을 때 최소값을 구하였다.
추가적으로 x축의 수평으로 보낸다고 전부 쿠션이 되기전에 target에 도달하는 것이 아니라 (5,9) -> (5,12) -> (5,8) 같은 경우도 존재하므로 이를 한번 더 처리해주었다.
코드
import java.util.*;
class Solution {
//공이 굴러간 거리
public int len(int x1, int y1, int x2, int y2){
return (int) Math.pow(Math.abs(x1-x2),2) + (int) Math.pow(Math.abs(y1-y2),2);
}
public ArrayList<Integer> solution(int m, int n, int startX, int startY, int[][] balls) {
ArrayList<Integer> answer=new ArrayList<>();
for (int[] ball : balls){
Integer temp=99999999;
// 오른쪽 기준으로 점대칭
int ny = startY + (n-startY)*2;
// 그림 1.공의 위치가 수직, 수평이 아닌 경우
if(startX!=ball[0] && ny!=ball[1]){
temp=Math.min(temp, len(startX, ny, ball[0], ball[1]));
}
// 그림 2.공의 위치가 수평, startY>ball[1]인 경우
if(startX==ball[0] && startY>ball[1]){
temp=Math.min(temp, len(startX, ny, ball[0], ball[1]));
}
// 좌
ny = startY - (startY * 2);
if(startX!=ball[0] && ny!=ball[1]){
temp=Math.min(temp, len(startX, ny, ball[0], ball[1]));
}
if(startX==ball[0] && startY<ball[1]){
temp=Math.min(temp, len(startX, ny, ball[0], ball[1]));
}
// 하
int nx = startX - (startX * 2);
if(nx!=ball[0] && startY!=ball[1]){
temp=Math.min(temp, len(nx, startY, ball[0], ball[1]));
}
if(startX<ball[0] && startY==ball[1]){
temp=Math.min(temp, len(nx, startY, ball[0], ball[1]));
}
// 상
nx = startX + (m-startX) * 2;
if(nx!=ball[0] && startY!=ball[1]){
temp=Math.min(temp, len(nx, startY, ball[0], ball[1]));
}
if(startX>ball[0] && startY==ball[1]){
temp=Math.min(temp, len(nx, startY, ball[0], ball[1]));
}
answer.add(temp);
}
return answer;
}
}
'문제풀이 > 기타' 카테고리의 다른 글
[JAVA] Pro 호텔 대실 (0) | 2023.07.04 |
---|---|
[JAVA] [기타] Pro 시소 짝꿍 (0) | 2023.07.03 |
[자바] [백트래킹] 백준 16508 전공책 (0) | 2023.04.28 |
[파이썬] [분할정복] 백준 1074 Z (0) | 2023.04.03 |
[파이썬] [슬라이딩] 백준 1522 문자열 교환 (0) | 2023.03.16 |