Skip to content

Commit 3cb7f16

Browse files
committed
[BOJ] 10775 공항 (G2)
1 parent 397ebff commit 3cb7f16

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

최어진/9주차/260226.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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

Comments
 (0)