문제풀이/기타

[JAVA] [수학] Pro 당구 연습

승무_ 2023. 6. 28. 11:54

문제

https://school.programmers.co.kr/learn/courses/30/lessons/169198?language=java# 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

그림 1

오른쪽 벽 기준으로 원쿠션이 된다고 가정할 때 공의 이동거리(빨간색 점선)는

(3,7)을 오른쪽 벽 기준으로 점 대칭한 (17,7)과 (7,3)사이의 거리와 같으므로 상,하,좌,우로 쿠션을 주었을 때 최소값을 구하였다.

 

그림 2

추가적으로 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;
    }
}