반응형
Programmers 파이썬 당구 연습
그냥 계산하는 게 빠른 문제
조건파악
1. 공은 절대 겹치지 않는다.
2. 모서리에 부딪히는 경로는 절대 최단 거리가 될 수 없다. (계산해보면 앎)
3. 공이 수직 또는 수평으로 나란히 있는 경우 원쿠션을 성공할 수 없는 경우의 수가 생긴다.
접근
상하좌우로 경우의 수는 네 개. 그냥 네 방향 다 계산해서 제일 작은 거 찾으면 된다.
거리를 계산하기 전에 좌표만 가지고 어떤 벽에 부딪힐 건지 선택할 수 있으면 좋겠는데, 방법을 모르겠다. 그걸 모르고 단순 계산으로 풀어도 시간초과가 나지 않으니 Lv.2이겠지.
의사코드
1. balls배열에 대해 반복
2. 두 공이 나란한지 확인
3. 원쿠션이 발생하도록 네 방향(또는 세 방향)에 부딪혀서 공을 맞추는 거리를 계산
4. 제일 짧은 것을 배열에 추가
구현
def solution(m, n, x, y, balls):
def cal(wall,x1,y1) :
width, height = x1 - x, y1 -y
if wall == 'up' :
height = 2 * n - y - y1
elif wall == 'right' :
width = 2 * m - x1 - x
elif wall == 'down' :
height = y1 + y
else:
width = x1 + x
return width**2 + height**2
def validate(wall,x1,y1) :
if x == x1 and wall in ['up','down'] :
if (y < y1 and wall == 'up') or (y > y1 and wall == 'down') :
wall = 'left' if x < m / 2 else 'right'
elif y == y1 and wall in ['left', 'right'] :
if (x > x1 and wall == 'left') or (x < x1 and wall == 'right') :
wall = 'up' if y > n / 2 else 'down'
return cal(wall,x1,y1)
answer = []
walls = ['up', 'right', 'down', 'left']
for target_ball in balls :
x1,y1 = target_ball
distance = [validate(wall,x1,y1) for wall in walls]
answer.append(min(distance))
return answer
반응형
'Software Engineering' 카테고리의 다른 글
[Python 문제 풀이] 프로그래머스 '두 원 사이의 정수 쌍' (0) | 2023.05.04 |
---|---|
[Python 문제 풀이] 프로그래머스 '무인도 여행' (0) | 2023.05.04 |
[Python 문제 풀이] 프로그래머스 '연속된 부분 수열의 합' (0) | 2023.04.27 |
Maven 프로젝트 JDK 런타임 버전 설정하기 (0) | 2023.04.22 |
[Python 문제 풀이] 프로그래머스 '과제 진행하기' (0) | 2023.04.19 |