2 분 소요

사용 언어: Python3, Java

문제

당구 연습

풀이

내 풀이

def solution(m, n, startX, startY, balls):
    # 거리 제곱을 반환하는 함수
    def calcDistSquare(x1, y1, x2, y2):
        return (x1-x2)**2 + (y1-y2)**2
    
    # 최소 거리(의 제곱)를 반환하는 함수
    def getMinDist(sx, sy, tx, ty):
        mn = 1e9
        # 위쪽 벽 (y=n 대칭)
        if (sx != tx) or ((sx == tx) and (sy > ty)): # x끼리 같지 않던가, 같으면 sy > ty
            mn = min(mn, calcDistSquare(sx, sy, tx, n+(n-ty)))
        
        # 아래쪽 벽 (y=0 대칭)
        if (sx != tx) or ((sx == tx) and (sy < ty)): # x끼리 같지 않던가, 같으면 sy < ty
            mn = min(mn, calcDistSquare(sx, sy, tx, -ty))
        
        # 오른쪽 벽 (x=m 대칭)
        if (sy != ty) or ((sy == ty) and (tx < sx)): # y끼리 같지 않던가, 같으면 tx < sx
            mn = min(mn, calcDistSquare(sx, sy, m+(m-tx), ty))
        
        # 왼쪽 벽 (x=0 대칭)
        if (sy != ty) or ((sy == ty) and (tx > sx)): # y끼리 같지 않던가, 같으면 tx > sx
            mn = min(mn, calcDistSquare(sx, sy, -tx, ty))
        
        return mn
    
    ans = []
    for targetX, targetY in balls:
        ans.append(getMinDist(startX, startY, targetX, targetY))
        
    return ans
  • 테스트 케이스: 성공
  • 제출 결과: 성공
  • 친 공이 반사되는 벽을 기준으로 맞을 공의 위치를 대칭시킨 다음, 두 공 사이의 직선 거리를 재면 친 공의 이동거리를 구할 수 있다.

IMG_0481

다른 풀이

참고

# 네 벽에 맞은 경우를 모두 계산하여 최소리턴
def solve(x, y, startX, startY, targetX, targetY):
    dists = []
    # 위쪽 벽에 맞는 경우
    # 단, x좌표가 같고 목표의 y가 더 크면 안된다.
    if not (targetX == startX and targetY > startY):
        d2 = (targetX - startX) ** 2 + (targetY - 2*y + startY) ** 2
        dists.append(d2)
    # 아래쪽 벽에 맞는 경우
    # 단, x좌표가 같고 목표의 y가 더 작으면 안된다.
    if not (targetX == startX and targetY < startY):
        d2 = (targetX - startX) ** 2 + (targetY + startY) ** 2
        dists.append(d2)
    # 왼쪽 벽에 맞는 경우
    # 단, y좌표가 같고 목표의 x가 더 작으면 안된다.
    if not (targetY == startY and targetX < startX):
        d2 = (targetX + startX) ** 2 + (targetY - startY) ** 2
        dists.append(d2)
    # 오른쪽 벽에 맞는 경우
    # 단, y좌표가 같고 목표의 x가 더 크면 안된다.
    if not (targetY == startY and targetX > startX):
        d2 = (targetX - 2*x + startX) ** 2 + (targetY - startY) ** 2
        dists.append(d2)
    return min(dists)
    
def solution(m, n, startX, startY, balls):
    answer = []
    for x, y in balls:
        answer.append(solve(m, n, startX, startY, x, y))
    return answer
  • 테스트 케이스: 성공
  • 제출 결과: 성공
  • 친 공이 반사되는 벽을 기준으로 맞을 공의 위치를 대칭시킨 다음, 두 공 사이의 직선 거리를 재면 친 공의 이동거리를 구할 수 있다.


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기