다각형의 면적 2166

    

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

다각형의 면적을 구하는데 고등학교때 기하와 벡터 배울때 한 거 떠올려서 풀었다.

신발끈 공식. 오랜만에 생각해본다.

공식만 알면 그냥 풀리는 골드 중에서 제일 쉬운 문제 아닐까

 


```python

N=int(input())

points=[]

for i in range(N):

    x,y=map(int,input().split())

    points.append((x,y))


a1,a2=points[0][0],points[0][1]

area=0

for i in range(1,N-1):

    b1,b2=points[i][0],points[i][1]

    c1,c2=points[i+1][0],points[i+1][1]

    area+=(a1*b2+b1*c2+c1*a2-(a2*b1+b2*c1+c2*a1))/2


print(round(abs(area),1))

```

하다가 오목한 도형일경우 빼줘야 하는 경우 때문에 전체 계산후 abs를 해야 했는데 그 부분을 고려 안해서 조금 고민했다.


관련해서 찾아보다가 볼록 껍질이라는 개념이 있다고 해서 흥미로워서 덧붙여둠.


---


# 볼록껍질 관련 설명

볼록껍질(Convex Hull) 알고리즘은 2차원 평면 위에 주어진 점들 중에서 이 점들을 모두 포함하는 가장 작은 볼록 다각형을 찾는 문제를 해결하기 위한 알고리즘입니다. 쉽게 말해, 주어진 점들 중 가장 바깥쪽에 위치한 점들을 연결하여 만들어진 다각형을 찾는 것입니다.


### 볼록껍질의 정의

볼록껍질은 다음과 같은 성질을 가집니다:

- 볼록 다각형: 이 다각형의 각 내부각은 180도보다 작으며, 다각형의 내부에 있는 임의의 두 점을 잇는 선분이 항상 다각형 내부에 위치합니다.

- 주어진 점 집합을 모두 포함하는 최소의 다각형입니다.


### 볼록껍질 알고리즘의 종류

여러 가지 알고리즘이 있지만, 대표적인 볼록껍질 알고리즘은 다음과 같습니다:


1. **그레이엄 스캔(Graham Scan)**

   - 그레이엄 스캔은 점들을 기준점에서 시계 방향으로 정렬한 다음, 스택을 이용해 볼록껍질을 구성하는 방식입니다.

   - 주요 단계:

     1. 주어진 점들 중 가장 아래쪽에 있는 점을 기준점으로 설정합니다.

     2. 다른 점들을 기준점에서 시계 방향으로 각도에 따라 정렬합니다.

     3. 스택에 점들을 추가하면서 볼록껍질의 일부가 되지 않는 점들을 제거해 나갑니다.

   - 시간 복잡도: \(O(n \log n)\)


2. **자비스의 선물 포장 알고리즘(Jarvis March, Gift Wrapping)**

   - 선물 포장 알고리즘은 마치 포장지를 돌려가며 선물을 포장하는 방식처럼, 점들을 하나씩 선택해 가면서 볼록껍질을 만들어 나갑니다.

   - 주요 단계:

     1. 가장 왼쪽에 있는 점부터 시작하여 볼록껍질의 한 점을 선택합니다.

     2. 현재 선택한 점에서 가장 멀리 떨어진 점을 찾아 선택합니다.

     3. 선택한 점이 출발점으로 돌아올 때까지 이 과정을 반복합니다.

   - 시간 복잡도: 최악의 경우 \(O(nh)\) (여기서 \(h\)는 볼록껍질에 속하는 점의 수)


3. **QuickHull**

   - QuickSort와 유사한 방식으로 동작하는 알고리즘입니다.

   - 주어진 점들을 이용해 볼록껍질의 왼쪽과 오른쪽 점을 선택하고, 그 사이에 있는 점들을 재귀적으로 처리하여 볼록껍질을 구합니다.

   - 시간 복잡도: 평균적으로 \(O(n \log n)\), 최악의 경우 \(O(n^2)\)


4. **Chan’s Algorithm**

   - 이 알고리즘은 그레이엄 스캔과 자비스 알고리즘을 결합한 방식으로, \(O(n \log h)\) 시간 복잡도를 가집니다.

   - \(h\)는 볼록껍질에 포함된 점의 수로, 이 알고리즘은 점들이 적은 경우에 더 효율적입니다.


### 예시

만약 다음과 같은 점들이 주어졌다고 가정해봅시다: 

```

(0, 0), (1, 1), (2, 2), (3, 1), (2, 0), (0, 2)

```

이 점들을 포함하는 볼록껍질은 (0, 0), (0, 2), (3, 1), (2, 0)을 연결한 다각형이 됩니다. 볼록껍질 알고리즘은 이 점들을 찾고, 이 점들을 연결한 다각형을 반환하게 됩니다.


### 실제 활용 예

볼록껍질 알고리즘은 컴퓨터 그래픽스, GIS(지리 정보 시스템), 기하학적 문제 해결 등 여러 분야에서 활용됩니다. 예를 들어, 지도에서 주어진 도시들 중 가장 외곽에 있는 도시들을 찾아 경계를 표시하는 데 이용될 수 있습니다.


이상으로 볼록껍질 알고리즘의 개요를 설명드렸습니다. 알고리즘을 구현하거나 더 깊이 있는 내용을 알고 싶다면, 특정 알고리즘에 대해 더 질문해 주세요!

댓글

이 블로그의 인기 게시물

js 스트링에서 요소 갯수 세기

STUDY

javascript cheatsheet