얼음녹차의 블로그
article thumbnail

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/169198

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

처음 작성한 코드

  • 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를 반대로 적용하면 된다.
  • 두 공의 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]]))

문제에서 모서리에 쿠션을 하는 경우가 예시로 나오는데, 이러한 점대칭은 벽에 쿠션을 하는 선대칭보다 항상 거리가 길어지기 때문에 고려하지 않아도 된다.

 

다른 코드

사소한 차이는 있으나 크게 다른 코드, 혹은 더 좋은 코드를 발견하지 못했다.

코드를 조금 더 깔끔하게 작성한 코드는 많으니 다른 풀이도 참고해 볼 만하다.

profile

얼음녹차의 블로그

@PERIR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!