|
| 1 | +/* 백준 10775번: 공항 (2회차) */ |
| 2 | + |
| 3 | +const fs = require('fs'); |
| 4 | +const lines = fs |
| 5 | + .readFileSync('/dev/stdin', { encoding: 'utf-8' }) |
| 6 | + .toString() |
| 7 | + .split('\n'); |
| 8 | +let ptr = 0; |
| 9 | +const input = () => lines[ptr++]; |
| 10 | + |
| 11 | +// GATES, PLANES <= 10^5 |
| 12 | +const GATES = Number(input()); |
| 13 | +const PLANES = Number(input()); |
| 14 | + |
| 15 | +// 포인트 |
| 16 | +// - 주어진 Gi는 해당 비행기를 1번 ~ Gi번 게이트 중 하나에 도킹 가능하다는 말, |
| 17 | +// - 앞에 어떤 비행기가 오든 뒤의 비행기를 감안하려면 최대한 게이트 번호가 큰 곳에 도킹시키는 게 이득 아닌가...? |
| 18 | +// 시간복잡도 계산 |
| 19 | +// 1. 모든 비행기에 대해서 체크 -> 10^5 |
| 20 | +// 2. 각 비행기마다 모든 게이트 체크 -> 10^5 |
| 21 | +// -> 그냥 돌리면 안 된다.. 근데 모든 비행기에 대해 체크는 줄일 수 없으므로 게이트 체크에서 logN 이내로 줄여야 함 |
| 22 | +// 아이디어 |
| 23 | +// Gi = 5, 5, 4, 1인 비행기가 있다고 할 때, 맨 처음 Gi=5인 비행기가 5번 게이트에 도킹하면 |
| 24 | +// 사실상 이제 앞으로의 Gi=5인 모든 비행기는 Gi=4인 것이나 다름없음 |
| 25 | + |
| 26 | +dockings = Array.from({ length: GATES + 1 }, () => false); |
| 27 | +parents = Array.from({ length: GATES + 1 }, (_, idx) => idx); |
| 28 | + |
| 29 | +function find(x) { |
| 30 | + if (x === parents[x]) return x; |
| 31 | + parents[x] = find(parents[x]); |
| 32 | + return parents[x]; |
| 33 | +} |
| 34 | + |
| 35 | +function union(a, b) { |
| 36 | + const A = find(a); |
| 37 | + const B = find(b); |
| 38 | + |
| 39 | + if (A < B) parents[B] = A; |
| 40 | + else if (A > B) parents[A] = B; |
| 41 | +} |
| 42 | + |
| 43 | +let answer = 0; |
| 44 | +for (const _ of Array.from({ length: PLANES })) { |
| 45 | + const Gi = Number(input()); |
| 46 | + // console.log('Gi:', Gi); |
| 47 | + let gate = find(Gi); |
| 48 | + // console.log('MAX_GATE:', gate); |
| 49 | + |
| 50 | + while (true) { |
| 51 | + if (!dockings[gate]) { |
| 52 | + dockings[gate] = true; |
| 53 | + union(Gi, gate - 1); |
| 54 | + break; |
| 55 | + } |
| 56 | + |
| 57 | + gate--; |
| 58 | + if (gate < 1) break; |
| 59 | + } |
| 60 | + |
| 61 | + if (!gate) break; |
| 62 | + answer += 1; |
| 63 | + |
| 64 | + // console.log(dockings.slice(1).map((v) => (v ? 'O' : '.'))); |
| 65 | + // console.log(parents.slice(1)); |
| 66 | + // console.log(); |
| 67 | +} |
| 68 | + |
| 69 | +console.log(answer); |
0 commit comments