본문 바로가기
알고리즘 풀이/프로그래머스

[프로그래머스] 당구 연습(Java)

by char_lie 2024. 4. 10.
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/169198

 

프로그래머스

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

programmers.co.kr

당구 연습 문제

당구를 쳤을때 굴러간 거리의 최솟값의 제곱을 반환하는 문제

 

#사용 알고리즘

구현

조건에 따른 분기

📌문제 접근 포인트

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;
    }
}
반응형

댓글