아이디어
처음에 접근을 공항과 비행기 노드를 따로 나눠서 생각해보았다. 어떤 식으로 데이터를 정의하고, 자료구조에 담을 것인가 생각하다가 보니, 이 아이디어는 유니온파인드 스럽지 않은 문제를 유니온파인드로 설정하는 아이디어였다. 문제의 까다로운 조건들을 보면 merge와 find를 어떤 식으로 활용하라는 힌트가 주어져 있다.
★★
도킹을 하면 그 노드는 방문하지 못하게끔 되고, parent설정을 통해 방문하지 못하게된 노드를 다시 방문할 때는 parent로 유도한다. 방문과 동시에 merge를 통해 parent를 다시 설정하게 되고, 그 다음 번 방문을 위해 경로압축도 진행된다.
점검해볼 사항
- 유니온파인드를 트리의 관점에서 바라보기
- 경로압축을 통해 이런 문제 처럼 시간절약을 할 수 있다.
- find와 merge의 활용
시간복잡도
O(P) : P를 find하고 다음 번 위치까지 merge지정해두기 때문에 대략 매번 O(1)의 연산을 하게 되고, 그것을 P번 반복한다.
https://github.com/jongwuner/Algorithm/blob/master/BOJ/10775.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include<iostream> #include<vector> using namespace std; vector<int> p; int find(int idx) { if (p[idx] < 0) return idx; return p[idx] = find(p[idx]); } int main() { int N, M, ans = 0; scanf("%d%d", &N, &M); p.resize(N + 1, -1); for (int i = 0, node; i <= N; i++) { scanf("%d", &node); node = find(node); if (!node) break; p[node] = node - 1; ans++; } printf("%d\n", ans); return 0; } | cs |
'Coding > Algorithm' 카테고리의 다른 글
BOJ(백준) 3745 - 오름세 (0) | 2019.02.03 |
---|---|
BOJ(백준) 12837 - 가계부(Hard) (0) | 2019.02.03 |
BOJ(백준) 16562 - 친구비 (0) | 2019.01.23 |
BOJ(백준) 3780 - 네트워크 연결 (0) | 2019.01.22 |
BOJ(백준) 2504 - 괄호의 값 (0) | 2019.01.20 |