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

2025. 5. 28. 10:04·Algorithm/백준
반응형

들어가며

코딩테스트에서 자주 등장하는 "다각형의 면적" 문제, 어떻게 풀어야 할지 막막했던 경험 있으신가요?
오늘은 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 등)에서도 널리 활용됩니다.
  • 공식만 외워두면, 구현은 매우 간단합니다.

참고 자료

  • 백준 2166번 문제
  • Shoelace formula (Wikipedia)

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

반응형
저작자표시 비영리 변경금지 (새창열림)

'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
'Algorithm/백준' 카테고리의 다른 글
  • [백준 / 27172 / Python] 수 나누기 게임
  • [백준 / 1647 / Python] 도시 분할 계획
  • [백준 / 27440 / Python] 1 만들기
  • [백준 / 13705 / Python] Ax+Bsin(x)=C
Kun Woo Kim
Kun Woo Kim
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, React, TypeScript, Next.js, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.
  • Kun Woo Kim
    WhiteMouseDev
    김건우
  • 깃허브
    포트폴리오
    velog
  • 전체
    오늘
    어제
  • 공지사항

    • [인사말] 이제 티스토리에서도 만나요! WhiteMouse⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (100) N
      • Frontend Development (39) N
      • Backend Development (21) N
      • Algorithm (33) N
        • 백준 (11) N
        • 프로그래머스 (17)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (3)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    frontend development
    tailwindcss
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kun Woo Kim
[백준 / 2166 / Python] 다각형의 면적
상단으로

티스토리툴바