기록

백준_2166_다각형의 면적 본문

코딩테스트/python

백준_2166_다각형의 면적

youngyin 2021. 2. 2. 12:22

문제

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

 

2166번: 다각형의 면적

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

www.acmicpc.net

풀이

1) CCW (Counter Clock Wise)

https://www.acmicpc.net/problem/11758

 

11758번: CCW

첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌표는 서로 다르다.

www.acmicpc.net

from sys import stdin
(x1, y1), (x2, y2), (x3, y3) = [list(map(int, stdin.readline().split())) for i in range(3)]
area = ((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1))
if area>0 : print(1)
elif area==0 : print(0)
else : print(-1)

A, B, C 세 점을 꼭짓점으로 하는 삼각형 ABC의 넓이 S는 AB벡터와 BC벡터의 외적으로 표현할 수 있다.

2) 넓이 구하기

다각형을 이루는 순서대로 좌표가 주어지므로 첫번째 점을 한 꼭짓점으로 잡고 순서대로 두점을 선택한다. 두 벡터의 외적 CCW를 이용하여  삼각형의 넓이를 구해서 더한다. 두 벡터가 이루는 각도에 따라 부호가 다르므로 필요한 부분의 넓이를 구할 수 있다.

코드

from sys import stdin
N = int(stdin.readline())
loc = [list(map(int, stdin.readline().split())) for i in range(N)]

# 작은 삼각형의 넓이 계산하기
ccw = lambda x1, y1, x2, y2, x3, y3 : ((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1))/2

# 넓이 구하기
ans = 0
for i in range(2, N) :
    ans += ccw(*loc[0], *loc[i-1], *loc[i])
print(round(abs(ans),2))

 

 

'코딩테스트 > python' 카테고리의 다른 글

백준_17404_RGB거리 2  (0) 2021.02.05
백준_1149_RGB거리  (0) 2021.02.05
백준_1654_랜선 자르기  (0) 2021.01.18
백준_1920_수 찾기  (0) 2021.01.18
백준_2467_용액  (0) 2021.01.15
Comments