코딩테스트/Python

[Programmers] Level 2. 당구 연습

swwho 2025. 2. 19. 15:11
728x90
반응형

🔗 Problem Link

 

프로그래머스

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

programmers.co.kr


❔Thinking

  • 칠 당구공의 위치와 맞춰야 하는 당구공의 위치가 주어질 때, 한 번 이상의 쿠션으로 맞추는 최단 거리를 반환한다.
  • 당구공이 벽에 맞을 경우, 입사각과 반사각은 같다. (모서리의 경우, 가는 경로 그대로 돌아온다.)
  • 당구대의 가로 세로 크기는 1000 이하이며, 맞춰야 하는 당구공은 1000개 이하이다.

💻Solution

def solution(m,n,startX,startY,balls):
    def dist_calc(x1,y1,x2,y2):
        return (x1-x2)**2 + (y1-y2)**2
    answer = []
    for x,y in balls:
        tmp_dist = []
        # 왼쪽 벽
        if not (startX >= x and startY == y):
            tmp_dist.append(dist_calc(startX,startY,-x,y))
        # 오른쪽 벽
        if not (startX <= x and startY == y):
            tmp_dist.append(dist_calc(startX,startY,2*m-x,y))
        # 위쪽 벽
        if not (startY <= y and startX == x):
            tmp_dist.append(dist_calc(startX,startY,x,2*n-y))
        # 아래쪽 벽
        if not (startY >= y and startX == x):
            tmp_dist.append(dist_calc(startX,startY,x,-y))

        answer.append(min(tmp_dist))
    return answer

🗝️keypoint

  1. 반사된 경로를 구하는 보다 쉬운 방법은, 목적 당구공이 벽을 거울삼아 반대로 이동했다고 생각하는 것이다.
  2. 치는 당구공의 경로에 목적 당구공이 있다면 해당 벽에는 맞출 수 없다.