익명 사용자
로그인하지 않음
토론
기여
계정 만들기
로그인
IT 위키
검색
그레이엄 스캔
편집하기
IT 위키
이름공간
문서
토론
더 보기
더 보기
문서 행위
읽기
편집
원본 편집
역사
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
그레이엄 스캔(Graham scan)은 평면상의 여러 점들 중에서 '''볼록 껍질(convex hull)을 효율적으로 구하는 알고리즘'''이다. 정렬 기반으로 접근하며, 가장 아래쪽 점을 기준으로 각도를 비교해 반시계 방향으로 볼록 껍질을 구성한다. 2차원 계산기하학에서 가장 널리 쓰이는 방법 중 하나다. ==개념== *입력: 2차원 평면상의 점 n개 *출력: 해당 점들을 둘러싸는 볼록 껍질을 구성하는 점들의 리스트 (반시계 방향 정렬) *정렬 후 스택 구조를 사용해 껍질을 생성함 ==핵심 아이디어== #가장 아래쪽(y좌표가 가장 작음) → 가장 왼쪽(x좌표가 가장 작음)인 점 P를 기준점으로 선택 #나머지 점들을 P로부터의 '''극각(polar angle)'''에 따라 반시계 방향으로 정렬 #정렬된 점들을 차례로 처리하면서, '''세 점이 시계 방향을 이루면 중간 점을 제거''' #최종적으로 남는 점들이 볼록 껍질을 이룸 ==알고리즘 절차== #기준점 P<sub>0</sub> 선택 #극각 기준 정렬 (동일한 각도일 경우 거리순) #스택에 첫 세 점을 삽입 #나머지 점들에 대해: ##스택에서 최근 두 점과 현재 점으로 만든 방향 확인 ##시계 방향이면 스택 pop (볼록하지 않음) ##반시계 방향이면 스택 push (볼록 껍질 유지) ==[[반시계 판별|ccw (Counter Clockwise) 판별]] 함수== *세 점 A, B, C에 대해 방향성 판별: **양수: 반시계 방향 **0: 일직선 **음수: 시계 방향 *수식: (B<sub>x</sub> - A<sub>x</sub>)(C<sub>y</sub> - A<sub>y</sub>) - (B<sub>y</sub> - A<sub>y</sub>)(C<sub>x</sub> - A<sub>x</sub>) ==시간 복잡도== *정렬: O(n log n) *스택 처리: O(n) *전체 시간 복잡도: '''O(n log n)''' ==파이썬 예시== <pre> from math import atan2 def ccw(a, b, c): return (b[0]-a[0])*(c[1]-a[1]) - (b[1]-a[1])*(c[0]-a[0]) def graham_scan(points): pivot = min(points, key=lambda p: (p[1], p[0])) sorted_pts = sorted(points, key=lambda p: (atan2(p[1]-pivot[1], p[0]-pivot[0]), p)) hull = [] for pt in sorted_pts: while len(hull) >= 2 and ccw(hull[-2], hull[-1], pt) <= 0: hull.pop() hull.append(pt) return hull </pre> ==장점== *비교적 간단하고 효율적인 구현 *실무에서도 널리 사용되는 대표적인 볼록 껍질 알고리즘 ==단점== *정렬이 필요하므로 매우 작은 입력(n이 작음)에서는 [[Jarvis March]]보다 느릴 수 있음 ==같이 보기== *[[볼록 껍질 (알고리즘)]] *[[계산기하학]] *[[Jarvis March]] *[[Andrew's Monotone Chain]] *[[ccw 알고리즘]] ==참고 문헌== *Graham, R. L. (1972). An efficient algorithm for determining the convex hull of a finite planar set. Information Processing Letters *Cormen, T. H. et al. (2009). Introduction to Algorithms. MIT Press *https://cp-algorithms.com/geometry/convex-hull.html [[분류:기하학]] [[분류:알고리즘]] [[분류:수학]]
요약:
IT 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
IT 위키:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
둘러보기
둘러보기
대문
최근 바뀜
광고
위키 도구
위키 도구
특수 문서 목록
문서 도구
문서 도구
사용자 문서 도구
더 보기
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
문서 기록