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

파이썬으로 다각형의 둘레 구하기: 좌표 기반 둘레 계산 프로그램

2차원 평면 위에 단순 다각형(simple polygon)의 꼭짓점들이 순서대로 나열된 좌표 리스트가 주어졌을 때, 이 다각형의 둘레(perimeter)를 계산하는 문제를 파이썬으로 해결해 보겠습니다.

문제 이해하기

예를 들어, 입력이 다음과 같다고 가정해 보겠습니다.

points = [(0, 0), (0, 5), (3, 5), (3, 0)]

이 네 개의 점은 가로 3, 세로 5인 직사각형을 이룹니다. 따라서 두 변의 길이는 각각 3이고, 나머지 두 변의 길이는 각각 5입니다.

둘레 = 2 × 5 + 2 × 3 = 16

해결 접근 방법

다각형의 둘레는 인접한 꼭짓점 사이의 거리를 모두 더하면 됩니다. 마지막 꼭짓점에서 첫 번째 꼭짓점으로 돌아오는 거리까지 포함하는 것이 핵심입니다. 알고리즘의 흐름은 다음과 같습니다.

  • getInfo() 함수를 정의합니다. 이 함수는 x1, y1, x2, y2 네 개의 값을 받습니다.
  • 유클리드 거리 공식인 √((x1−x2)² + (y1−y2)²) 을 반환하여 두 점 (x1, y1)과 (x2, y2) 사이의 거리를 구합니다.
  • 메인 함수(solve)에서는 다음 과정을 수행합니다.
    • N := 점 리스트의 크기
    • (firstx, firsty) := points[0] — 첫 번째 점 저장
    • (prevx, prevy) := (firstx, firsty) — 이전 점 초기화
    • res := 0 — 둘레 누적 변수 초기화
    • i가 1부터 N−1까지일 때 반복:
      • (nextx, nexty) := points[i]
      • res := res + getInfo(prevx, prevy, nextx, nexty)
      • prevx := nextx, prevy := nexty로 갱신
    • 마지막 점에서 첫 번째 점까지의 거리도 더함: res := res + getInfo(prevx, prevy, firstx, firsty)
    • res 반환

구현 예제

아래 코드를 통해 실제 구현을 확인해 보겠습니다.

from math import sqrt

def getInfo(x1, y1, x2, y2):
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

def solve(points):
    N = len(points)
    firstx, firsty = points[0]
    prevx, prevy = firstx, firsty
    res = 0

    for i in range(1, N):
        nextx, nexty = points[i]
        res = res + getInfo(prevx, prevy, nextx, nexty)
        prevx = nextx
        prevy = nexty
    res = res + getInfo(prevx, prevy, firstx, firsty)
    return res

points = [(0, 0), (0, 5), (3, 5), (3, 0)]
print(solve(points))

입력

[(0, 0), (0, 5), (3, 5), (3, 0)]

출력

16.0

코드 설명

getInfo() 함수는 피타고라스 정리를 활용해 두 점 사이의 직선 거리(유클리드 거리)를 계산합니다. solve() 함수는 리스트를 순회하면서 인접한 점들 사이의 거리를 누적으로 더하고, 마지막에 마지막 점과 첫 번째 점을 연결하는 변의 길이까지 추가하여 다각형의 전체 둘레를 완성합니다.

이 방식은 삼각형, 사각형뿐만 아니라 임의의 볼록·오목 다각형에도 동일하게 적용할 수 있어, 시간 복잡도 O(N)으로 효율적으로 둘레를 계산할 수 있습니다.