DEV/코딩테스트

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

9thxg 2025. 4. 22. 16:06

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제 예시를 통해서 가로, 세로가 동일할 것이란 생각에 어떤 방향이든 동일한 최솟값을 가질 거 같아 구현해 보았지만 가로, 세로가 달라질 수 있기 때문에 틀렸음

 

먼저 아이디어가 떠올랐던 것이 y절편, x절편이었고 이후에 좀 더 생각해 보니 x, y축으로 반사하여 두 점의 길이를 구하면 그 값이 원쿠션의 길이였음

 

다만 가로, 세로 크기가 달라서 모든 면에 대해 반사한 점에 대한 길이를 구해주어야 함

 

또한 x 또는 y가 시작점과 같은 경우 조건에 따라 반사면을 제외하고 계산해야 함

  • 문제 예시에도 나와있지만 이 경우에는 목표 공을 직선으로 치기 때문에 원쿠션 성립이 되지 않음

수학적 지식과 센스를 자주 사용했었다면 빠르게 풀 수 있었을 것 같음, 수학적 지식을 사용하는 것을 연습해야 함

function solution(m, n, startX, startY, balls) {
    var answer = [];
    
    balls.forEach((ball) => {
        const [x, y] = ball;
        
        let minLength = Infinity;
        
        if(!(startY == y && startX > x)){
            const width = startX - -x;
            const height = startY - y;
            
            minLength = Math.min(minLength, Math.pow(width, 2) + Math.pow(height, 2))
        }
        
        if(!(startY == y && startX < x)){   
            const width = startX - (2 * (m - x) + x);
            const height = startY - y;
            
            minLength = Math.min(minLength, Math.pow(width, 2) + Math.pow(height, 2))
        }
        
        if(!(startX == x && startY > y)){   
            const width = startX - x;
            const height = startY - -y;
            
            minLength = Math.min(minLength, Math.pow(width, 2) + Math.pow(height, 2))
        }
        
         if(!(startX == x && startY < y)){   
            const width = startX - x;
            const height = startY - (2 * (n - y) + y);
            
            minLength = Math.min(minLength, Math.pow(width, 2) + Math.pow(height, 2))
        }

        answer.push(minLength);
    })
    
    return answer;
}