[프로그래머스] 당구 연습 자바(Java)
본문 바로가기
알고리즘 풀이

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

by IYK2h 2023. 3. 17.
728x90

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

 

프로그래머스

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

programmers.co.kr

풀이

크게 케이스가 3가지로 나뉘고 큰 케이스 안에 작은 케이스로 나눠서 풀었습니다.

  • startY 와 목표 y가 같은 경우
  • 아래 3가지 중 최소 값
    • 가벼운 x 벽과 원 쿠션
    • 시작점 x가 목표점 x값보다 작은 경우
    • 시작점 x가 목표점 x값보다 큰 경우
    • 두 공이 같은 선상에 있을 경우 시작지점에서 벽 사이에 목표지점이 있으면 쿠션이 안되므로 예외처리
  • startX 와 목표 X가 같은 경우
  • 아래 3가지 중 최소 값
    • 가벼운 x 벽과 원 쿠션
    • 시작점 y가 목표점 y값보다 작은 경우
    • 시작점 y가 목표점 y값보다 큰 경우
    • 두 공이 같은 선상에 있을 경우 시작지점에서 벽 사이에 목표지점이 있으면 쿠션이 안되므로 예외처리
  • else
  • 아래 4가지 중 최소 값
    • x가 m(벽)과 가까운 경우
    • x가 0(벽)과 가까운 경우
    • y가 n(벽)과 가까운 경우
    • y가 0(벽)과 가까운 경우

코드

class Solution {
    public int[] solution(int m, int n, int startX, int startY, int[][] balls) {
        int[] answer = new int[balls.length];
        
        int[] arr = new int[4];
        
        for(int i = 0; i < balls.length; i++){
        
            // y 같은 경우
            if(startY == balls[i][1]){
                // 벽과 가까운 거리 구하기
                int minY = Math.min(n - startY, startY);

                // 가까운 벽과 왔다 갔다.
                arr[0] = (int) Math.pow(balls[i][0] - startX , 2) + (int) Math.pow(minY * 2, 2);
                // 시작점 x가 목표점 x값보다 작은 경우
                if(startX < balls[i][0]){
                    arr[1] = (int) Math.pow(startX + balls[i][0], 2);
                }
                // 시작점 x가 목표점 x값보다 큰 경우
                else {
                    arr[1] = (int) Math.pow(m - startX + m - balls[i][0], 2);
                }
                answer[i] = Math.min(arr[0], arr[1]);
            }
            // x 같은 경우
            else if(startX == balls[i][0]){
                // 벽과 가까운 거리 구하기
                int minX = Math.min(m - startX, startX);
                arr[0] = (int) Math.pow(minX * 2, 2) + (int) Math.pow(balls[i][1] - startY, 2);
                // 시작점 y가 목표점 y값보다 작은 경우
                if(startY < balls[i][1]){
                    arr[1] = (int) Math.pow(startY + balls[i][1], 2);
                }
                // 시작점 y가 목표점 y값보다 큰 경우
                else {
                    arr[1] = (int) Math.pow(n - startY + n - balls[i][1], 2);
                }
                answer[i] = Math.min(arr[0], arr[1]);
            }
            // 서로 다른경우
            else {
                
                // x가 m(벽)과 가까운 경우
                arr[0] = (int) Math.pow( m + (m - startX) - balls[i][0], 2) + (int) Math.pow(balls[i][1] - startY, 2);
                // x가 0과 가까운 경우
                arr[1] = (int) Math.pow(startX + balls[i][0], 2) + (int) Math.pow(balls[i][1] - startY, 2);
                // y가 n(벽)과 가까운 경우
                arr[2] = (int) Math.pow( n + (n - startY) - balls[i][1], 2) + (int) Math.pow(balls[i][0] - startX, 2);
                // y가 0과 가까운 경우
                arr[3] = (int) Math.pow(startY + balls[i][1] , 2)+ (int) Math.pow(balls[i][0] - startX, 2);
                      
                int min = arr[0];
                for(int j = 1; j < 4; j++){
                    if(min > arr[j]){
                        min = arr[j];
                    }
                }
                answer[i] = min;
            }
        }
        
        return answer;
    }
}

 

728x90

댓글