convex hull은 좌표평면과 도형에 관련한 문제이다. 좌표평면에서 여러가지 점들이 있을 때, 이 점들을 모두 포함하면서 크기(블록)가 제일 작은 도형을 만드는 문제이다.
이 문제는 점들을 정렬하는 과정이 필요하기에 보다 빠를 수 없다.

점들이 이렇게 위치해있다고 하자. 이 때 Convex Hull은 제일 바깥쪽에 있는 점들을 모아 연결한 도형이다.

그러므로 이러한 모양이 된다.
Convex Hull을 파악하기 전 알아두면 좋은 요소가 있는데, CCW이다.
CCW는 점 3개를 연결하여 좌회전하는지, 우회전하는지를 파악하는 방법이다.
3점의 위치가 주어진다.
각각은 이다.
에서 를 거쳐 로 갈 때, 좌회전을 하는지 우회전을 하는지를 판별할 수 있는가?

면 우회전
면 좌회전
의 방법. 모든 점에 대해서 을 지정해서 좌회전인지 우회전인지 확인함.

점 와 에 대해서 어떠한 점 을 뽑고 CCW를 했을 때 모두 우회전이므로 는 Convex Hull의 경계선에 있다.

점 와 에 대해서 을 뽑고 CCW를 했을 때는 좌회전이고, 를 뽑고 CCW를 했을 때는 우회전이므로 Convex Hull의 경계선에 있지 않다.
점 는 번 뽑으며, 점 는 번 뽑음. 점 은 최대 번 뽑으므로 이 걸림.
의 방법.

의 바로 위에 있는 점 가 조건을 만족하지 않음. 이런 경우 의 위쪽 점을 로 바꾸며 이어감


만족하는 를 찾았으면 를 로 바꾸고 알고리즘이 종료할 때 까지 수행함.
의 방법. 각도를 기준으로 정렬하고 Stack에 점들을 넣어 만드는 방법이다.
우회전과 좌회전은 바꾸어도 차이가 없지만, 한 방향으로 탐색하기로 결정했으면 계속 그 방향으로 해야함.

Graham Scan이 어느정도 진행 된 상태임.

이 때 점 e가 (인위적으로) 들어옴. e-d-c의 CCW는 좌회전이므로 우리가 우회전으로 탐색한 것과 반대됨.

d를 pop하고 e-c-b를 CCW함. 똑같이 좌회전이므로 우리가 우회전으로 탐색한 것과 반대됨.

c를 pop하고 e-b-a를 CCW함. 우회전이므로 조건을 만족함.

e를 push하고 다음 점 f에 대해서 f-e-b를 수행... 반복함
. 접선을 이용하는 방법이다.

Plain Sweeping이 어느정도 진행되었다. 네모 안에 Right Hull이 있으며 x가 추가되는 상황이다.

맨 끝점과 x를 잇는다. 공간 안에 있는 점을 지운다.

점이 공간 안에 있는지를 파악하게 도와주는 자료다. p-q-x와 q-x-r의 CCW는 동일하나 q-x-r과 x-r-s의 CCW는 다르다. r은 공간 안에 처음 들어오는 점이다. 이를 반대 방향으로 하면 1개나 2개의 점이 나오고 점과 점 사이의 점을 모두 지우면 된다.
이는 접선을 찾는다고 말할 수 있다. 공간 사이에 점이 무수히 많이 있으면 접하는 선을 찾는다고 예기할 수 있기 때문이다.

지워 나가다가 공간 밖에 있는 점과 연결한다.

다시 제일 왼쪽에 있는 점 y가 들어온다.

이하 반복


점을 찾는 과정은 어찌 보면 으로 보여 시간복잡도가 이라고 생각할 수 있다. 하지만 Balanced Tree로 구현하면 이진 탐색하듯이 찾을 수 있다. 그러므로
의 시간이 걸린다.
을 통해서 Convex Hull을 만들었을 때, 새 점이 추가되면 어떻게 해야하는가?

먼저, 안에 새 점이 추가되면 특별히 수행할 일은 없다. 점의 안과 밖의 구분은 앞에서 말한 방법과 Balanced Tree를 이용한다.

밖에 새 점이 추가되면 접선을 그어 해결한다.


Left Upper Hull과 Right Upper Hull이 있다.

우리는 공통 접선을 찾아서 두개를 이어줘야 한다.

각 Upper Hull의 제일 왼쪽부터 시작해서 뚫고 지나가는 지 확인을 한다. CCW를 통해 가능하다. Right Upper Hull쪽에서 뚫고 지나간다.

Right Upper Hull쪽에서 뚫고 지나갔으므로 오른쪽의 설정점을 한 칸 옮겼다. 이번엔 Left Upper Hull쪽에서 뚫고 지나간다.

Left Upper Hull쪽에서 뚫고 지나갔으므로 왼쪽의 설정점을 한 칸 옮겼다.

두개가 중복되면 아무거나 옮겨도 상관없다.



두 점을 이어주고 Balanced Tree를 통해 안에 있는 점들을 없애준다.
제일 먼 점 2개에 대해서 옆에 테두리를 그리고 테두리를 돌리면서 찾는 방법이다.
정렬하는 시간이 이 걸리는 것을 제외하면 점은 개를 찾으므로 알고리즘 자체는 의 시간이 걸린다. 다만 총 계산은 정렬하는 시간을 포함하므로 이 걸린다.

한 방향으로 테두리를 돌린다.

두 테두리 중 하나라도 서로 두 점을 만나게 되면 잇는다.

테두리를 갱신하고 다시 반복한다. 이번엔 아래서 만났으므로 두 점을 잇는다.

다시 위에서 만났다. 또 이어준다.

Convex Hull이 만들어지면 종료한다.