문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/169198
처음 작성한 코드
- 4가지 벽에 대해 원 쿠션을 시행하는 경우 제일 최솟값을 반환하는 알고리즘을 작성했다.
- 원 쿠션을 하기 전에 공끼리 먼저 만나면 안 되므로 x나 y 좌표가 같은 경우는 특정 벽에 원 쿠션하는 경우가 불가능하고, 비교군에서 제외해야 한다.
- 두 공의 x와 y 좌표 모두 같지 않은 경우
- 좌, 우에 있는 벽에 공이 쿠션을 할 경우
- 벽에 대해 선대칭을 하므로 다음과 같은 값을 합한다.
- y의 거리는 각 y 좌표를 뺀 값이 된다.
- x의 거리는 좌측에 있는 벽기준으로 startX + a 고되고, 우측에 있는 벽기준으로 2*m - startX - a 가 된다.
- 위, 아래에 있는 벽에 공이 쿠션을 할 경우
- 좌, 우에 대한 사례에서 x와 y를 반대로 적용하면 된다.
- 이렇게 총 4가지 경우에서 최솟값을 찾으면 된다.
- 좌, 우에 있는 벽에 공이 쿠션을 할 경우
- 두 공의 x와 y 좌표 중 하나가 같은 경우
- y 좌표가 같은 경우
- 좌, 우에 있는 벽에 공이 쿠션을 할 경우 기존에 경우와 같이, x의 거리는 좌측에 있는 벽기준으로 startX + a 고되고, 우측에 있는 벽기준으로 2*m - startX - a 가 된다.
- 위, 아래에 있는 벽에 공이 쿠션을 할 경우 지나가는 경로상에 공이 있으면 안 되므로, 조건문을 사용한다.
- start x가 a보다 작다면 좌측 벽에, 크다면 우측 벽에 쿠션을 하게 한다.
- 이렇게 총 3가지 경우에서 최솟값을 찾으면 된다.
- x 좌표가 같은 경우
- y 좌표가 같은 경우에서 x와 y를 반대로 적용하면 된다.
- y 좌표가 같은 경우
- 두 공의 x와 y좌표 모두가 같은 경우
- 이 경우는 조건에서 제외했기 때문에 고려하지 않아도 된다.
def solution(m, n, startX, startY, balls):
answer = []
for i in balls:
if startX == i[0]:
answer.append(min(min(startX + i[0], (2 * m - startX - i[0])) ** 2 + (startY - i[1]) ** 2,
(2 * n - startY - i[1]) ** 2 if startY >= i[1] else (startY + i[1]) ** 2))
elif startY == i[1]:
answer.append(min((startX - i[0]) ** 2 + min(startY + i[1], (2 * n - startY - i[1])) ** 2,
(2 * m - startX - i[0]) ** 2 if startX >= i[0] else (startX + i[0]) ** 2))
else:
answer.append(min((startX - i[0]) ** 2 + min(startY + i[1], (2 * n - startY - i[1])) ** 2,
min(startX + i[0], (2 * m - startX - i[0])) ** 2 + (startY - i[1]) ** 2))
return answer
# 입출력 예시
print(solution(10, 10, 3, 7, [[7, 7], [2, 7], [7, 3]]))
문제에서 모서리에 쿠션을 하는 경우가 예시로 나오는데, 이러한 점대칭은 벽에 쿠션을 하는 선대칭보다 항상 거리가 길어지기 때문에 고려하지 않아도 된다.
다른 코드
사소한 차이는 있으나 크게 다른 코드, 혹은 더 좋은 코드를 발견하지 못했다.
코드를 조금 더 깔끔하게 작성한 코드는 많으니 다른 풀이도 참고해 볼 만하다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Programmers][Python] 햄버거 만들기 (0) | 2023.03.27 |
---|---|
[Programmers][Python] 공원 산책 (0) | 2023.03.27 |
[Programmers][Python] 둘만의 암호 (0) | 2023.03.22 |
[Programmers][Python] 덧칠하기 (0) | 2023.03.21 |
[Programmers][Python] 옹알이 (2) (0) | 2023.03.13 |