본문 바로가기

알고리즘&자료구조

(12)
[백준11662] 민호와 강호 민호와 강호의 출발좌표와 도착좌표를 입력받아, 두 사람이 일정한 속도로 도착지점까지 간다고 가정했을때, 두 사람의 최단거리를 구하는 문제이다. (인정 오차는 10^-6) IDEA 양 끝을 경계로 하여 이진탐색을 하면 쉽게 구할 수 있다. 이때 탐색 중단 기준은 좌우 경계의 거리가 10^-6이하인 경우이다. void getClosestDist( double mxl, double myl, double mxr, double myr, double kxl, double kyl, double kxr, double kyr) { if (getDist(mxl, myl, mxr, myr) < 0.00001 || getDist(kxl, kyl, kxr, kyr) < 0.00001) return; double mxm = (m..
[백준1967] 트리의 지름 트리의 지름 : 트리내의 최장경로를 찾는문제 IDEA [부모노드를 포함하는 최장경로] 트리내의 모든 경로는 결국 부모노드를 기준으로 2개의 서브트리에서의 경로를 합친것이다. 위의 H-D-B-E-J 경로를 보면 B노드를 기준으로 왼쪽 자식 서브트리와 오른쪽 자식 서브트리의 경로를 합친거라고 생각할 수 있다. (이때 B노드와 같이 경로의 루트노드가 되는 노드를 최종 부모 노드라고 하겠다.) 최종부모노드 X의 경로 = (서브트리의 경로) - X - (서브트리의 경로) 즉, 최장 경로는 최종 부모노드의 서브트리 중, 가장 긴 경로는 가진 상위 2개의 경로에 최종부모노드를 합친 것이 된다. 위 그림에서 최종 부모 노드 A를 포함하는 최장 경로는 서버트리중 가장 긴 경로를 가진 B-D-I 경로와 C-F-M 경로를 ..
[백준2004] 조합 0의 개수 2004. 조합 0의 개수 Idea 0의 개수를 찾기 위해서는 최종값을 소인수분해 했을때 소인수 2의 개수와 5의 개수를 구해야 한다. 즉 nCm의 소인수분해를 해야한다. 하지만 소인수 분해를 위해 1부터 n까지 완전 탐색을 하면 O(n)의 시간복잡도가 필요하여 시간초과가 일어난다. (n> m; ll num2 = numPFactor(2,n) - numPFactor(2,n-m) - numPFactor(2,m); ll num5 = numPFactor(5,n) - numPFactor(5,n-m) - numPFactor(5,m); int ret = (num2 < num5) ? num2 : num5; cout
[백준1168] 요세푸스 문제2 - Segment Tree Segment Tree #include #include using namespace std; vector arr(12); vector tree(48); int init(int idx, int start, int end) { if (start == end) return tree[idx] = arr[start]; int mid = (start + end) / 2; return tree[idx] = init(idx*2, start, mid) + init(idx*2+1, mid+1, end); } void update(int node, int start, int end, int index, int diff) { if (!(start