반응형
들어가며
코딩테스트에서 자주 등장하는 "다각형의 면적" 문제, 어떻게 풀어야 할지 막막했던 경험 있으신가요?
오늘은 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 등)에서도 널리 활용됩니다.
- 공식만 외워두면, 구현은 매우 간단합니다.
참고 자료
이렇게 정리하면, 신발끈 공식과 다각형 면적 구하기에 대한 이해와 실전 적용이 훨씬 쉬워질 것입니다!
궁금한 점이 있다면 언제든 댓글로 남겨주세요.
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준 / 2143 / Python] 두 배열의 합 (0) | 2025.06.13 |
---|---|
[백준 / 27172 / Python] 수 나누기 게임 (0) | 2025.06.13 |
[백준 / 1647 / Python] 도시 분할 계획 (0) | 2025.06.10 |
[백준 / 27440 / Python] 1 만들기 (0) | 2025.05.30 |
[백준 / 13705 / Python] Ax+Bsin(x)=C (0) | 2025.05.30 |