728x90

http://www.acmicpc.net/problem/2166

 

2166번: 다각형의 면적

첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.

www.acmicpc.net

 

 

# 조건

  • 2차원 평면상에 N(3 ≤ N ≤ 10,000)개의 점으로 이루어진 다각형이 있다.
  • 이 다각형의 면적을 구하는 프로그램을 작성하시오.
 

입력

  • 첫째 줄에 N이 주어진다.
  • 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다.
  • 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.
 

출력

  • 첫째 줄에 면적을 출력한다.
  • 면적을 출력할 때에는 소수점 아래 둘째 자리에서 반올림하여 첫째 자리까지 출력한다.
 

# 접근 방법

  • 변의 길이가 다른 다각형 넓이 구하는 공식을 사용하면 된다.
    • 다각형의 좌표를 쓴다.
    • 반시계 방향 순서로 x와 y좌표를 리스트로 나열한 후 첫 꼭지점의 좌표를 맨 마지막에 하나 더 추가해준다.
    • 각 꼭지점의 x좌표를 다음 꼭지점 좌표의 y값과 곱한 후 각 결과들을 더한다. - 결과1
    • 반대로 각 y좌표 값을 다음 x좌표 값들과 곱하여 각 결과들을 더해준다. - 결과2
    • (결과2 - 결과1) / 2 하면 다각형의 넓이가 나온다.
    • 신발끈 정리라고도 불린다.

 
  • 문제에서는 다각형을 이루는 순서대로 주어지기 때문에 정렬을 따로 해줄 필요는 없다.

 

import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline

N = int(input())
dot = []
for _ in range(N):
    dot.append([*map(int, input().split())])

dot.append(dot[0])
plus = 0
minus = 0
for i in range(N):
    plus += dot[i][0]*dot[i+1][1]
    minus += dot[i][1]*dot[i+1][0]

S = abs(plus-minus)/2
print(round(S,1))
728x90