μ•Œκ³ λ¦¬μ¦˜/κΈ°ν•˜ν•™

[λ°±μ€€ 2166 πŸ₯‡] λ‹€κ°ν˜•μ˜ 면적

1eehyunji 2023. 7. 13. 02:05

문제

2차원 평면상에 N(3 ≤ N ≤ 10,000)개의 점으둜 이루어진 λ‹€κ°ν˜•μ΄ μžˆλ‹€. 이 λ‹€κ°ν˜•μ˜ 면적을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 N이 μ£Όμ–΄μ§„λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” λ‹€κ°ν˜•μ„ μ΄λ£¨λŠ” μˆœμ„œλŒ€λ‘œ N개의 점의 x, yμ’Œν‘œκ°€ μ£Όμ–΄μ§„λ‹€. μ’Œν‘œκ°’μ€ μ ˆλŒ“κ°’μ΄ 100,000을 λ„˜μ§€ μ•ŠλŠ” μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 면적을 좜λ ₯ν•œλ‹€. 면적을 좜λ ₯ν•  λ•Œμ—λŠ” μ†Œμˆ˜μ  μ•„λž˜ λ‘˜μ§Έ μžλ¦¬μ—μ„œ λ°˜μ˜¬λ¦Όν•˜μ—¬ 첫째 μžλ¦¬κΉŒμ§€ 좜λ ₯ν•œλ‹€.

λ¬Έμ œν’€μ΄

import sys

n=int(sys.stdin.readline())

point=[list(map(int, sys.stdin.readline().split(' '))) for _ in range(n)]

def ex_product(p1, p2):
    global point
    v0=point[0]
    v1=point[p1]
    v2=point[p2]
    return 0.5*(v0[0]*v1[1]+v1[0]*v2[1]+v2[0]*v0[1]-v1[0]*v0[1]-v2[0]*v1[1]-v0[0]*v2[1])

ans=0
for i in range(1,n-1):
    ans+=ex_product(i,i+1)

print(abs(ans))

μ’Œν‘œλ‘œ μ‚Όκ°ν˜•μ˜ 면적을 κ΅¬ν•˜λŠ” μ‹ λ°œλˆ 곡식을 μ‚¬μš©ν–ˆλ‹€.

λ‹€κ°ν˜•μ˜ 경우, 첫번째 μ’Œν‘œλ₯Ό ν¬ν•¨ν•΄μ„œ μ‹œκ³„ λ°˜λŒ€ λ°©ν–₯으둜 μˆœμ„œλŒ€λ‘œ 두 개의 μ’Œν‘œλ₯Ό μ„ νƒν•΄μ„œ 첫번째 μ’Œν‘œμ™€ μ„ νƒλœ 두 개의 μ’Œν‘œ, 총 3개의 μ’Œν‘œλ₯Ό μ΄μš©ν•΄μ„œ ν•΄λ‹Ήν•˜λŠ” μ‚Όκ°ν˜•μ˜ 면적을 ꡬ해주면 λœλ‹€. 

μœ„μ™€ 같이 μ˜€κ°ν˜•μ„ μ˜ˆμ‹œλ‘œ λ“€λ©΄, μž…λ ₯을 λ°›λŠ” μˆœμ„œλŒ€λ‘œ 즉, μ‹œκ³„ λ°˜λŒ€ λ°©ν–₯으둜 μ’Œν‘œλ₯Ό 2κ°œμ”© μ„ νƒν•˜λ©΄μ„œ 면적을 ꡬ해주면 λœλ‹€. 

0번째 점을 κΈ°μ€€μœΌλ‘œ μˆœμ„œλŒ€λ‘œ 번호λ₯Ό λΆ€μ—¬ν–ˆλ‹€. 이 경우, (0,1,2) 외적 κ°’ + (0,2,3) 외적 κ°’ + (0,3,4) 외적 값이닀.

 

μ—¬κΈ°μ„œ μ£Όμ˜ν•  점은 였λͺ©ν•œ 뢀뢄이 μžˆλŠ” λ‹€κ°ν˜•μ˜ 계산이닀. μ‹ λ°œλˆ κ³΅μ‹λŒ€λ‘œ 면적을 ꡬ할 λ•Œλ§ˆλ‹€ μ ˆλŒ“κ°’μœΌλ‘œ μ²˜λ¦¬ν•΄μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ, μ ˆλŒ“κ°’ μ²˜λ¦¬λŠ” λͺ¨λ“  면적 값을 λ‹€ λ”ν•œ 후에 μ²˜λ¦¬ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 

μœ„μ™€ 같이 였λͺ©ν•œ 뢀뢄인 (0,1,2)의 μ™Έμ ν•œ 값은 μ ˆλŒ“κ°’ 처리λ₯Ό ν•΄μ£Όμ§€ μ•ŠμœΌλ©΄ 음수둜 처리되기 λ•Œλ¬Έμ— μžλ™μœΌλ‘œ κ³„μ‚°λœ λ©΄μ μ—μ„œ μ‚­μ œ μ²˜λ¦¬κ°€ λ˜λ©΄μ„œ 정닡을 λ„μΆœν•  수 μžˆλ‹€.