본문 바로가기

알고리즘7

CCW 기하 알고리즘의 가장 기초가 되는 알고리즘이다.가르쳐주신 분 말씀으로는 "대부분의 기하 문제는 CCW로 풀이가 가능하다." 라고 하실 정도니 꼭 알아두자. CCW는 벡터의 외적을 이용하여 평면상에 세 점이 있을 때 점들의 위치관계를 판단할수 있는 알고리즘이며, 회전방향이 반시계인 경우 양의 값, 시계인 경우 음의 값, 일직선 상에 있는 경우 0의 값을 가지게 된다. 점이 3개인 경우, [ A(x1,y1), B(x2,y2), C(x3,y3) ] 일 때, CCW(A,B,C) = (x1*y2 + x2*y3 + x3*y1) - (x2*y1 + x3*y2 + x1*y3) 2020. 4. 4.
피보나치 수 피보나치 수를 구하는 알고리즘은 여러가지다. 그 중 대표적으로 1. 재귀를 통한 단순 구현 (Top-down) [ O(2^(N/2)) ] 2. 반복문을 통한 단순 구현 || 메모이제이션 (Bottom-up) [ O(N) ]2. 1 피사노의 주기 3. 행렬을 통한 분할 정복 [ O(logN) ] 4. 일반항을 통한 계산 [ O(logN) ] N이 엄청 큰 경우 1, 2번 방법으론 시간내 풀 수 없으니 시간 복잡도가 O(logN)인 방법으로 해결해야한다. 3번, 행렬을 통한 분할 정복을 보자. 피보나치 식을 행렬로 표현하면 위와 같이 표현이 가능하다. 증명은 (여기)에서 볼 수 있다. N번째 피보나치 수를 구하기 위해서 제곱을 하면서 찾아가게 되는데 어떤 수의 제곱수 X^n = X^(n/2) * X^(n/2.. 2020. 4. 4.
Union Find(합집합 찾기) 서로소 집합 자료구조 중 하나로 무향 그래프의 연결된 요소들을 추적할 수 있다.(by 위키백과)위키에 있는 의사코드를 보면 상당히 간단하게 구현이 가능하다. function MakeSet(x) x.parent := x function Find(x) if x.parent == x return x else return Find(x.parent) function Union(x, y) xRoot := Find(x) yRoot := Find(y) xRoot.parent := yRoot위 모양은 단순한 형태로 구현한 것이다.위 코드에서 문제점이 있는데 사향 이진 트리와 같은 모양으로 구성되면 매우 비효율 적이다. 그렇기 때문에 Find(x)함수에서 약간의 처리를 해주면 된다. function Find(x) if x.. 2019. 8. 15.
Bubble Sort (거품정렬) 자신과 다음원소를 비교해서 큰 것을 계속 오른쪽으로 swap한다. 맨 오른쪽을 제외하고 다시 반복한다. bubbleSort(A[],n){ for last 2018. 10. 27.