Algorithm/백준

[백준 / 2166 / Python] 다각형의 면적

Kun Woo Kim 2025. 5. 28. 10:04
반응형

들어가며

코딩테스트에서 자주 등장하는 "다각형의 면적" 문제, 어떻게 풀어야 할지 막막했던 경험 있으신가요?
오늘은 GIS, 게임 개발, CAD 등 실무에서도 널리 쓰이는 신발끈 공식(Shoelace Formula)을 활용해,
백준 2166번 문제를 쉽고 빠르게 해결하는 방법을 소개합니다.


문제 요약

  • 문제: N개의 꼭짓점으로 이루어진 단순 다각형의 넓이를 구하라.
  • 입력: 꼭짓점 좌표가 시계/반시계 방향으로 주어짐
  • 출력: 넓이를 소수점 첫째 자리까지 반올림

예시 입력

4
0 0
4 0
4 3
0 3

예시 출력

12.0

신발끈 공식(Shoelace Formula)이란?

신발끈 공식은 다각형의 꼭짓점 좌표만으로 넓이를 구할 수 있는 강력한 수학 공식입니다.
이름의 유래는, 좌표를 곱해가며 더하고 빼는 모습이 신발끈을 엮는 모양과 닮았기 때문입니다.

공식

[
\text{Area} = \frac{1}{2} \left| \sum_{i=1}^{n} (x_i y_{i+1} - x_{i+1} y_i) \right|
]

  • 마지막 꼭짓점 다음에는 다시 첫 꼭짓점으로 돌아가야 하므로,
    ( x_{n+1} = x_1, ; y_{n+1} = y_1 )로 처리합니다.

구현 포인트 & 실생활 비유

  • 좌표 리스트 닫기:
    시작점으로 다시 돌아와야 하므로,
    x.append(x[0]), y.append(y[0])로 리스트를 닫아줍니다.

  • 좌측 곱/우측 곱:
    각각 ( x_i y_{i+1} ), ( x_{i+1} y_i )의 합을 구해 차를 절댓값 처리 후 2로 나눕니다.

  • 비유:
    마치 신발끈을 엮듯, 좌표를 순서대로 곱해가며 더하고 빼는 과정입니다.


Python 코드 예시

import sys
input = sys.stdin.readline

N = int(input())
x, y = [], []
for _ in range(N):
    ex, ey = map(int, input().split())
    x.append(ex)
    y.append(ey)
x.append(x[0])  # 시작점 다시 추가
y.append(y[0])  # 시작점 다시 추가

rx, ry = 0, 0
for i in range(N):
    rx += x[i] * y[i + 1]
    ry += y[i] * x[i + 1]

area = abs((rx - ry) / 2)
print(round(area, 1))

왜 abs()를 쓸까?

  • 입력 좌표가 시계방향이면 면적이 음수,
    반시계방향이면 양수로 계산됩니다.
  • 우리는 넓이만 필요하므로 항상 abs()로 절댓값을 취합니다.

표로 보는 신발끈 공식 계산 예시

i x[i] y[i] x[i+1] y[i+1] x[i]*y[i+1] x[i+1]*y[i]
0 0 0 4 0 0 0
1 4 0 4 3 12 0
2 4 3 0 3 12 12
3 0 3 0 0 0 0
합: 24 합: 12
  • 넓이 = |24 - 12| / 2 = 6.0

결론 및 인사이트

  • 신발끈 공식은 다각형의 넓이를 좌표만으로 빠르게 구할 수 있는 강력한 도구입니다.
  • 코딩테스트뿐 아니라, 실무(지도, 그래픽, CAD 등)에서도 널리 활용됩니다.
  • 공식만 외워두면, 구현은 매우 간단합니다.

참고 자료


이렇게 정리하면, 신발끈 공식과 다각형 면적 구하기에 대한 이해와 실전 적용이 훨씬 쉬워질 것입니다!
궁금한 점이 있다면 언제든 댓글로 남겨주세요.

반응형