그리디
function coinChange(coins, amount) {
coins.sort((a, b) => b - a); // 내림차순
let count = 0;
for (let coin of coins) {
count += Math.floor(amount / coin); // 최대 금액으로 동전 개수 추가
amount %= coin; // 남은 금액 업데이트
if (amount === 0) break;
}
return amount === 0 ? count : -1; // Check if change was possible
}
최소 스패닝 트리 ( MST )
가능한 최소 총 가장자리 가중치를 가지며 순환이 없는
모든 정점을 포함하는 그래프의 하위 트리
프림
// 그래프의 인접 행렬 표현이라고 가정
function primsAlgorithm(graph) {
const numVertices = graph.length;
const selected = new Array(numVertices).fill(false);
const keys = new Array(numVertices).fill(Infinity);
keys[0] = 0; // 첫 번째 정점부터 시작
for (let i = 0; i < numVertices - 1; i++) {
let minKey = Infinity, u = -1;
// 최소 키 값을 갖는 정점 찾기
for (let v = 0; v < numVertices; v++) {
if (!selected[v] && keys[v] < minKey) {
minKey = keys[v];
u = v;
}
}
selected[u] = true;
// 인접한 정점의 키 값 업데이트
for (let v = 0; v < numVertices; v++) {
if (graph[u][v] && !selected[v] && graph[u][v] < keys[v]) {
keys[v] = graph[u][v];
}
}
}
return keys.reduce((a, b) => a + b, 0); // MST의 총 중량
}
크루스칼
find
union
// 'edges'가 [u, v, Weight] 형식의 모서리 배열이라고 가정
function kruskalsAlgorithm(edges, numVertices) {
edges.sort((a, b) => a[2] - b[2]); // 가중치를 기준으로 가장자리 정렬
const parent = Array.from({ length: numVertices }, (_, i) => i);
function find(i) {
if (parent[i] !== i) parent[i] = find(parent[i]);
return parent[i];
}
function union(i, j) {
const setI = find(i);
const setJ = find(j);
if (setI !== setJ) parent[setI] = setJ;
}
let mstWeight = 0;
for (let [u, v, weight] of edges) {
if (find(u) !== find(v)) {
union(u, v);
mstWeight += weight;
}
}
return mstWeight; // MST의 총 중량
}