상세 컨텐츠

본문 제목

[프로그래머스] 169198. 당구연습 | 수학 | 파이썬, 소스코드, 정답

Coding Test/문제풀이

by yooputer 2023. 5. 6. 16:39

본문

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

 

프로그래머스

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

programmers.co.kr


문제 요약

당구공 2개로 원쿠션을 연습한다.

당구공을 벽에 한번 맞힌 후 공을 맞춰야 한다.

공이 굴러간 거리의 제곱의 최소값을 구하라.


문제 조건

당구대의 가로길이, 세로길이, 당구공의 시작 x좌표, 당구공의 시작 y좌표, 목표하는 공의 좌표 리스트가 주어진다 


시행착오

처음에는 벽까지의 거리와 공까지의 거리를 나누어 계산하려고 했다.

근데 값이 실수가 나오고 거리 계산하기가 어려웠다.

그래서 다른 분들이 남겨주신 힌트를 보았다. 

JoChaeWoo님의 힌트

 

대칭을 사용하면 수학적으로 거리를 구할 수 있다는 것을 알게되었다. 


접근방법

  • 아래쪽 벽을 맞출 경우 x축 대칭한 공과의 거리를 구하면 된다.
    왼쪽 벽을 맞출 경우 y축 대칭한 공과의의 거리를 구하면 된다.
    오른쪽 벽을 맞출 경우 x=m축 대칭한 공과의 거리를 구하면 된다. 
    위쪽 벽을 맞출 경우 y=n축 대칭한 공과의 거릴르 구하면 된다.

흰공이 시작위치, 빨간공이 목표위치이다.

 

  • 만약 A공(흰색, 당구채로 치는 공)과 B공(빨간색, 맞춰야 하는 공)의 y좌표가 같고 A공이 B공보다 오른쪽에 있다면 왼쪽벽으로는 치면 안된다.
    만약 y좌표가 같고 A공이 B공보다 왼쪽에 있다면 오른쪽벽으로는 치면 안된다.
    만약 x좌표가 같고 A공이 B공보다 위쪽에 있다면 아래쪽벽으로는 치면 안된다.
    만약 x좌표가 같고 A공이 B공보다 아래에 있다면 위쪽벽으로는 치면 안된다.


소스코드

def solution(m, n, startX, startY, balls):
    answer = []

    def getDistance(x, y):
        return (x - startX)**2 + (y - startY)**2

    for bx, by in balls:
        min_distance = int(1e9)

        if not (startX == bx and startY > by):
            min_distance = min(min_distance, getDistance(bx, -by))

        if not (startX == bx and startY < by):
            min_distance = min(min_distance, getDistance(bx, 2*n - by))

        if not (startY == by and startX > bx):
            min_distance = min(min_distance, getDistance(-bx, by))

        if not (startY == by and startX < bx):
            min_distance = min(min_distance, getDistance(2*m - bx, by))

        answer.append(min_distance)

    return answer

 

 

관련글 더보기