Software Engineering

[Python 문제 풀이] 프로그래머스 '당구 연습'

머니기어 2023. 5. 2. 22:47
반응형

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

 

반응형