Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 다각형(Polygon)을 초기 상태로 되돌리는 프로그램 구현하기

정점이 n개인 다각형이 있다고 가정해 보겠습니다. 이 다각형에는 n개의 뒤집기 축(flipping axis)과 n개의 회전점이 존재하며, 뒤집기 축과 회전점은 다음과 같은 성질을 가집니다.

  • n이 홀수라면, 각 뒤집기 축은 하나의 정점과 반대편 변의 중점을 지난합니다.
  • n이 짝수라면, 절반의 축은 마주 보는 한 쌍의 정점을 지나고, 나머지 절반의 축은 마주 보는 한 쌍의 변을 지난합니다.
  • 인접한 두 축 사이의 각도는 360/2n도입니다.

이제 주어진 다각형에 회전 연산을 적용해 보겠습니다. 다각형에는 서로 다른 n가지 종류의 회전자(rotator)가 있으며, k-회전자는 다각형을 k번 축을 기준으로 시계 방향으로 (360 × k)/n도만큼 회전시킵니다.

입력 리스트(input_list)에는 여러 개의 정수 쌍(pair)이 들어 있습니다. 각 쌍의 첫 번째 정수는 다각형을 회전할지 뒤집을지를 결정하는데, 1이면 회전, 2이면 뒤집기를 의미합니다. 두 번째 정수는 k 값으로, 뒤집기 연산이라면 k번 축을 기준으로 뒤집고, 회전 연산이라면 그 각도만큼 회전하게 됩니다. 이러한 회전과 뒤집기는 리스트가 빌 때까지 순서대로 수행됩니다.

따라서 우리의 과제는 리스트에 연산을 하나 추가하여 다각형을 초기 위치로 되돌리는 것입니다.

Python으로 다각형(Polygon)을 초기 상태로 되돌리는 프로그램 구현하기

위 그림은 두 종류의 다각형에 대한 회전축을 보여줍니다.

예를 들어 입력이 n = 6, input_list = [[1, 2], [1, 4], [2, 3], [2, 5], [1, 6]]이라면 출력은 (1, 4)가 됩니다. 즉, 주어진 변환들을 모두 수행한 뒤 4번째 축을 기준으로 회전하면 다각형이 초기 위치로 재설정됩니다.

해결 접근 방법

이 문제는 누적 위치(position)와 뒤집기 여부(decision_var)를 추적하는 방식으로 해결할 수 있습니다. 단계별로 살펴보면 다음과 같습니다.

  • decision_var := False, position := 0으로 초기화합니다.
  • input_list의 각 항목에 대해 다음을 수행합니다.
    • x := item[0], y := item[1]
    • x가 1이면(회전), position := position + y
    • 그렇지 않으면(뒤집기), position := y − position 으로 갱신하고 decision_var를 반전(not)시킵니다.
  • 모든 연산이 끝난 뒤 position := position mod n을 적용합니다.
  • decision_var가 참이라면 (2, position)을 반환합니다.
  • 그렇지 않다면 (1, n − position)을 반환합니다.

예제 코드

아래 파이썬 구현을 통해 더 잘 이해해 보겠습니다.

def solve(n, input_list):
    decision_var = False
    position = 0

    for item in input_list:
        x = item[0]
        y = item[1]
        if x == 1:
            position += y
        else:
            position = y - position
            decision_var = not decision_var
    position = position % n

    if decision_var:
        return (2, position)
    else:
        return (1, n - position)

print(solve(6, [[1, 2], [1, 4], [2, 3], [2, 5], [1, 6]]))

입력

6, [[1, 2], [1, 4], [2, 3], [2, 5], [1, 6]]

출력

(1, 4)

이처럼 회전은 누적 덧셈으로, 뒤집기는 현재 위치를 기준으로 반사시키는 방식으로 처리한 뒤, 최종적으로 n으로 나눈 나머지와 뒤집기 여부만 판단하면 다각형을 초기 상태로 되돌리는 데 필요한 단 하나의 연산을 효율적으로 구할 수 있습니다.