๋ฌธ์
์ด ๋ฌธ์ ๋ ํธ๋ญ์ด ์์ฐจ์ ์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋ฉฐ, ๋ค๋ฆฌ ์์์์ ํธ๋ญ ์ํ(์๊ฐ, ๋ฌด๊ฒ)๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ์ ์ด ํต์ฌ์ ๋๋ค. ํธ๋ญ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผํ๋ ์ ์ ๊ณ ๋ คํ๋ฉด ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค.
๋์ ํ์ด
function solution(bridge_length, weight, truck_weights) {
let time = 0; // ๊ฒฝ๊ณผ ์๊ฐ
let bridgeQueue = []; // ๋ค๋ฆฌ ์์ ํธ๋ญ ์ํ ๊ด๋ฆฌ (ํธ๋ญ ๋ฌด๊ฒ์ ๋จ์ ์๊ฐ์ ๊ด๋ฆฌ)
let bridgeWeight = 0; // ํ์ฌ ๋ค๋ฆฌ ์์ ์๋ ํธ๋ญ๋ค์ ๋ฌด๊ฒ ํฉ
while (truck_weights.length > 0 || bridgeQueue.length > 0) {
time++;
// ๋ค๋ฆฌ์์ ํธ๋ญ์ด ๋๊ฐ ์๊ฐ์ธ์ง ํ์ธ
if (bridgeQueue.length > 0 && bridgeQueue[0].time === time) {
bridgeWeight -= bridgeQueue.shift().weight;
}
// ๋ค์ ํธ๋ญ์ด ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ์ ์๋์ง ํ์ธ
if (truck_weights.length > 0 && bridgeWeight + truck_weights[0] <= weight) {
const truckWeight = truck_weights.shift();
bridgeWeight += truckWeight;
bridgeQueue.push({ weight: truckWeight, time: time + bridge_length });
}
}
return time;
}
์๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํค๋ฉด์ ๊ฐ ๋จ๊ณ๋ง๋ค ๋ค๋ฆฌ๋ฅผ ์์ ํ ๊ฑด๋ ํธ๋ญ์ ์ ๊ฑฐํ๊ณ , ๋๊ธฐ ์ค์ธ ํธ๋ญ์ด ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ์ ์๋์ง(๋ฌด๊ฒ) ํ์ธํฉ๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด ์ ํธ๋ญ์ ๋ค๋ฆฌ์ ์ถ๊ฐํ๊ณ , ๊ทธ ํธ๋ญ์ด ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋ ์์ ์๊ฐ์ ๊ณ์ฐํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ชจ๋ ํธ๋ญ์ด ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
๋ฌธ์ ์
๋ค์ ๋ ์กฐ๊ฑด์ด ๋์์ ์ถฉ์กฑ๋ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋นํจ์จ์ฑ์ด ๋ฐ์ํฉ๋๋ค:
- ๋ค๋ฆฌ ์์ ์ ๋ ํธ๋ญ์ด ์์ง ๋ค๋ฆฌ๋ฅผ ์์ ํ ๊ฑด๋์ง ๋ชปํ์ ๋
- ๋๊ธฐ ์ค์ธ ๋ค์ ํธ๋ญ์ด ๋ค๋ฆฌ์ ์ค๋ ์ ํ์ผ๋ก ์ธํด ์ง์ ํ ์ ์์ ๋
์ด๋ฌํ ์ํฉ์์ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฏธ ์๋ ๋ณํ ์์ด ๋จ์ํ ์๊ฐ๋ง ์ฆ๊ฐ์ํค๋ฉฐ ๋ฐ๋ณต๋ฌธ์ ๊ณ์ ์คํํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ด๋ฐ '์ ์ฒด' ์ํฉ์ ๊ฐ์งํ๊ณ , ๋ค์ ์๋ฏธ ์๋ ์ด๋ฒคํธ(ํธ๋ญ์ ์ง์ถ ๋๋ ์ง์ )๊ฐ ๋ฐ์ํ ๋๊น์ง ์๊ฐ์ ํ ๋ฒ์ ๊ฑด๋๋ฐ๋ ์ต์ ํ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด๋ณผ ์ ์์ต๋๋ค.
๋ค๋ฅธ ํ์ด
์์ ์ฝ๋์ ์๊ฐ์ ๊ฑด๋๋ฐ๋ ์กฐ๊ฑด๋ฌธ์ ํ๋ ์ถ๊ฐํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ ์ธ๊ธํ '์ ์ฒด' ์ํฉ์ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
function solution(bridge_length, weight, truck_weights) {
let time = 0;
let bridgeQueue = [];
let bridgeWeight = 0;
while (truck_weights.length > 0 || bridgeQueue.length > 0) {
time++;
if (bridgeQueue.length > 0 && bridgeQueue[0].time === time) {
bridgeWeight -= bridgeQueue.shift().weight;
}
if (truck_weights.length > 0 && bridgeWeight + truck_weights[0] <= weight) {
const truckWeight = truck_weights.shift();
bridgeWeight += truckWeight;
bridgeQueue.push({ weight: truckWeight, time: time + bridge_length });
} else if (bridgeQueue.length > 0) {
// ๋ค์ ํธ๋ญ์ด ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ์ ์๋ ๊ฒฝ์ฐ, ๊ฐ์ฅ ๋นจ๋ฆฌ ๋๊ฐ ํธ๋ญ์ ์๊ฐ์ผ๋ก ์ ํ
time = bridgeQueue[0].time - 1;
}
}
return time;
}
ํด๋น ์์น์ ํธ๋ญ์ด ์์์ ์๋ฏธํ๋ 0
์ ์ด์ฉํ์ฌ ํด๊ฒฐํ ์๋ ์์ต๋๋ค.
function solution(bridge_length, weight, truck_weights) {
let time = 0;
let bridge = Array(bridge_length).fill(0);
let current_weight = 0;
while (truck_weights.length > 0 || current_weight > 0) {
time++;
// ๋ค๋ฆฌ์์ ๋๊ฐ๋ ํธ๋ญ ์ฒ๋ฆฌ
current_weight -= bridge.shift();
if (truck_weights.length > 0) {
// ๋ค์ ํธ๋ญ์ด ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ์ ์๋ ๊ฒฝ์ฐ
if (current_weight + truck_weights[0] <= weight) {
let truck = truck_weights.shift();
bridge.push(truck);
current_weight += truck;
} else {
// ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ์ ์๋ ๊ฒฝ์ฐ 0์ ์ถ๊ฐ
bridge.push(0);
}
} else {
// ๋จ์ ํธ๋ญ์ด ์๋ ๊ฒฝ์ฐ 0์ ์ถ๊ฐ
// ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ๋ ๋ถํ์ํ์ง๋ง ๋ค๋ฆฌ์ ๊ธธ์ด๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ
bridge.push(0);
}
}
return time;
}
Reference
[Programmers] ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ > ๋ค๋ฅธ ์ฌ๋์ ํ์ด
'๐ข Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript] ๋ฌธ์์ด ํด์ฑ์ ์ด์ฉํ ๊ฒ์ ํจ์ ๋ง๋ค๊ธฐ (0) | 2024.09.23 |
---|---|
[Javascript] ๋ ๊ฐ์ ์๋ก ํน์ ๊ฐ ๋ง๋ค๊ธฐ (1) | 2024.09.10 |
[Javascript][Programmers] ์นด๋ ๋ญ์น (0) | 2024.08.16 |
[Javascript][Programmers] ๊ธฐ๋ฅ ๊ฐ๋ฐ (0) | 2024.08.16 |
[Javascript][๋ฐฑ์ค] 1158๋ฒ - ์์ธํธ์ค ๋ฌธ์ (0) | 2024.08.15 |