-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathb2304.js
More file actions
68 lines (54 loc) · 1.62 KB
/
b2304.js
File metadata and controls
68 lines (54 loc) · 1.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
var fs = require("fs");
var input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const cols = input.slice(1).map((r) => r.split(" ").map(Number));
cols.sort((a, b) => a[0] - b[0]);
const start = cols[0][0];
const end = cols[cols.length - 1][0];
const pillars = Array(end + 1).fill(null);
for (const [L, H] of cols) {
pillars[L] = H;
}
const s1 = [];
const s2 = [];
const cp = cols.slice();
cp.sort((a, b) => b[1] - a[1]);
const tallest = cp[0];
let sum = 0;
let i = cols[0][0] + 1;
s1.push(cols[0]);
while (s1[s1.length - 1][1] !== tallest[1]) {
const top = s1[s1.length - 1];
const curr = pillars[i];
if (curr && curr > top[1]) {
// 기둥이 스택의 top 보다 크면
// 현재까지 넓이 누적시킨다 + push
const prevIdx = top[0];
const diff = i - prevIdx;
sum += diff * top[1];
s1.push([i, curr]);
} else {
// 기둥이 스택의 top 보다 작거나 같으면 다음걸로 넘어간다
i += 1;
}
}
i = cols[cols.length - 1][0] - 1;
s2.push(cols[cols.length - 1]);
while (s2[s2.length - 1][1] !== tallest[1]) {
const top = s2[s2.length - 1];
const curr = pillars[i];
if (curr && curr > top[1]) {
// 기둥이 스택의 top 보다 크면
// 현재까지 넓이 누적시킨다 + push
const prevIdx = top[0];
const diff = Math.abs(i - prevIdx);
sum += diff * top[1];
s2.push([i, curr]);
} else {
// 기둥이 스택의 top 보다 작거나 같으면 다음걸로 넘어간다
i -= 1;
}
}
const leftTop = s1[s1.length - 1];
const rightTop = s2[s2.length - 1];
sum += tallest[1] * (rightTop[0] - leftTop[0] + 1);
console.log(sum);