forked from egonSchiele/grokking_algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path01_set_covering.js
30 lines (25 loc) · 978 Bytes
/
01_set_covering.js
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
"use strict";
// You pass an array in, and it gets converted to a set.
let statesNeeded = new Set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"]);
const stations = {};
stations["kone"] = new Set(["id", "nv", "ut"]);
stations["ktwo"] = new Set(["wa", "id", "mt"]);
stations["kthree"] = new Set(["or", "nv", "ca"]);
stations["kfour"] = new Set(["nv", "ut"]);
stations["kfive"] = new Set(["ca", "az"]);
const finalStations = new Set();
while (statesNeeded.size) {
let bestStation = null;
let statesCovered = new Set();
for (let station in stations) {
const states = stations[station];
const covered = new Set([...statesNeeded].filter(x => states.has(x)));
if (covered.size > statesCovered.size) {
bestStation = station;
statesCovered = covered;
}
}
statesNeeded = new Set([...statesNeeded].filter(x => !statesCovered.has(x)));
finalStations.add(bestStation);
}
console.log(finalStations); // Set { 'kone', 'ktwo', 'kthree', 'kfive' }