[프로그래머스] 당구 연습
사용 언어: 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
- 테스트 케이스: 성공
- 제출 결과: 성공
- 친 공이 반사되는 벽을 기준으로 맞을 공의 위치를 대칭시킨 다음, 두 공 사이의 직선 거리를 재면 친 공의 이동거리를 구할 수 있다.
다른 풀이
# 네 벽에 맞은 경우를 모두 계산하여 최소리턴
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
- 테스트 케이스: 성공
- 제출 결과: 성공
- 친 공이 반사되는 벽을 기준으로 맞을 공의 위치를 대칭시킨 다음, 두 공 사이의 직선 거리를 재면 친 공의 이동거리를 구할 수 있다.
💛 개인 공부 기록용 블로그입니다. 👻