๋ฌธ์ : https://school.programmers.co.kr/learn/courses/30/lessons/42583
์นดํ ๊ณ ๋ฆฌ: ํ
์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ ์คํธ ๊ณ ๋์ Kit, https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit
์ฒ์์ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ , " ๊ทธ๋์ ํธ๋ญ์ด ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ช ์ด์ธ๊ฑฐ์ง,,? " ๋ฅผ ํ์ฐธ ๊ณ ๋ฏผํ๋ค. ํ์ง๋ง ๋ฌธ์ ์์ "๋ค๋ฆฌ์ ํธ๋ญ 2๋๊ฐ ์ฌ๋ผ๊ฐ ์ ์๋ค"๋ ์ ๋ณด๊ฐ ๊ฒฐ๊ตญ ํธ๋ญ์ด ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํ๋ค.
๋ค๋ฆฌ์ ํธ๋ญ์ด 2๋ ์ฌ๋ผ๊ฐ ์ ์๋ค๋ ๊ฒ์, ๋ค๋ฆฌ์ ๊ธธ์ด๊ฐ ํธ๋ญ 2๊ฐ ๋ค์ด๊ฐ ์ ๋๋ผ๋ ๊ฒ์ด๊ณ , ํธ๋ญ ํ ๋๊ฐ ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋ ์๊ฐ์ 2์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ด์๋ค.
๋จผ์ ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ ํธ๋ญ์ด ๋จผ์ ๋ค๋ฆฌ์์ ๋ด๋ ค์ค๊ธฐ ๋๋ฌธ์, FIFO์ ๊ตฌ์กฐ์ธ ํ๋ฅผ ์ฌ์ฉํ๋ค.
ํ์ฌ ๋ค๋ฆฌ์ ์ํฉ์ ๋ํ๋ด๋ ๋ฐฐ์ด์ธ bridge
๋ฅผ ์ฃผ์ด์ง ๋ค๋ฆฌ์ ๊ธธ์ด์ธ bridge_length
๋งํผ 0
์ผ๋ก ์ด๊ธฐํํ๋ค.
const bridge = new Array(bridge_length).fill(0);
์์ง ๋ค๋ฆฌ์ ์ฌ๋ผ๊ฐ์ง ์๊ณ ๋๊ธฐ ์ค์ธ ํธ๋ญ์ด ์๊ฑฐ๋ && ์์ง ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ณ ์๋ ํธ๋ญ์ด ์๋ค๋ฉด ๋ฃจํ๋ฅผ ๊ณ์ ๋๋ค.
while (truck_weights.length || numOfCrossingTruck > 0)
๋ค๋ฆฌ ์์ ์๋ ํธ๋ญ๋ค์ ์ผ์ชฝ์ผ๋ก ํ ์นธ์ฉ ์ด๋ํ๋ค. ๋ค๋ฆฌ ๋งจ ์ผ์ชฝ์ ํธ๋ญ์ด ์์๋ค๋ฉด, ๋ค๋ฆฌ์์ ํธ๋ ฅ์ ๋ด๋ ค์ค๋ค
if (bridge[0] !== 0) {
// ๋งจ ์ ์์๊ฐ 0์ด ์๋๋ผ๋ฉด, ์ฆ ํธ๋ญ์ด ๋ค๋ฆฌ ๋งจ ์ผ์ชฝ์ ์๋ค๋ฉด => ๋ค๋ฆฌ์์ ๋ด๋ ค์ค
numOfCrossingTruck--;
sumOfWeightInBridge -= bridge[0];
}
bridge.shift();
๋ค์ ํธ๋ญ์ด ์ฌ๋ผ์ฌ ์ ์๋ค๋ฉด (๋ค์ ํธ๋ญ์ด ์ฌ๋ผ์๋ ๋ค๋ฆฌ๊ฐ ์งํฑํ ์ ์๋ ์ต๋ ๋ฌด๊ฒ ์ดํ์ด๊ณ && ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์๋ ํธ๋ญ์ ์๋ณด๋ค ํ์ฌ ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ณ ์๋ ํธ๋ญ์ ์๊ฐ ์ ๋ค๋ฉด) truck_weight
์ ๋งจ ์์ชฝ ์์๋ฅผ ๋ค๋ฆฌ์ ์ฌ๋ ค์ค๋ค.
์ฌ๋ผ์ฌ ์ ์๋ค๋ฉด, ๋ค๋ฆฌ์ ๋งจ ๋์ 0์ ์ฌ๋ ค์ค์ผ๋ก์จ ์๋ฌด ํธ๋ญ๋ ์ฌ๋ผ์ค์ง ๋ชปํ์์ ๋ํ๋ด์ค๋ค.
// ๋ค์ ํธ๋ญ์ด ์ฌ๋ผ๊ฐ ์ ์์ผ๋ฉด
if (
numOfCrossingTruck < bridge_length &&
sumOfWeightInBridge + truck_weights[0] <= weight
) {
sumOfWeightInBridge += truck_weights[0]; // ๋ค๋ฆฌ ์ ํธ๋ญ์ ์ด ๋ฌด๊ฒ์ ๊ณง ๋ค์ด์ฌ ํธ๋ญ์ ๋ฌด๊ฒ๋ฅผ ๋ ํด์ค
numOfCrossingTruck++; // ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ณ ์๋ ํธ๋ญ์ ์ ์ฆ๊ฐ
bridge.push(truck_weights.shift()); // ๋ค๋ฆฌ ๋งจ ๋ค ์์๋ฅผ 0 =>
} else {
// ์ฌ๋ผ๊ฐ ์ ์๋ค๋ฉด, 0์ ๋ฃ๊ธฐ
bridge.push(0);
}
์๊ฐ(์ด)๋ฅผ ์ฆ๊ฐ์์ผ์ค๋ค.
seconds++;
๋ฃจํ๊ฐ ๋๋๋ฉด, ์ด ๊ฑธ๋ฆฐ ์๊ฐ์ return ํด์ค๋ค.
function solution(bridge_length, weight, truck_weights) {
const bridge = new Array(bridge_length).fill(0); // ํ์ฌ ๋ค๋ฆฌ์ ์ํฉ์ ๋ํ๋ด๋ ๋ฐฐ์ด => ํ
let numOfCrossingTruck = 0; // ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ณ ์๋ ํธ๋ญ์ ์
let seconds = 0; // ์ง๋ ์ด
let sumOfWeightInBridge = 0; // ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ณ ์๋ ํธ๋ญ์ ๋ฌด๊ฒ ํฉ
while (truck_weights.length || numOfCrossingTruck > 0) {
// ์์ง ๋๊ธฐ ์ค์ธ ํธ๋ญ์ด ์๊ฑฐ๋, ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ณ ์๋ ํธ๋ญ์ด ์๋ค๋ฉด
if (bridge[0] !== 0) {
// ํ ์นธ์ฉ ์ผ์ชฝ์ผ๋ก ๋ฐํ
๋ฐ, ๋งจ ์ ์์๊ฐ 0์ด ์๋๋ผ๋ฉด, ํธ๋ญ์ด ๋ค๋ฆฌ์์ ๋ด๋ ค๊ฐ๋ ๊ฒ์ด๋ฏ๋ก
numOfCrossingTruck--;
sumOfWeightInBridge -= bridge[0];
}
bridge.shift();
// ๋ค์ ํธ๋ญ์ด ์ฌ๋ผ๊ฐ ์ ์์ผ๋ฉด
if ( //
numOfCrossingTruck < bridge_length &&
sumOfWeightInBridge + truck_weights[0] <= weight
) {
sumOfWeightInBridge += truck_weights[0]; // ๋ค๋ฆฌ ์ ํธ๋ญ์ ์ด ๋ฌด๊ฒ์ ๊ณง ๋ค์ด์ฌ ํธ๋ญ์ ๋ฌด๊ฒ๋ฅผ ๋ ํด์ค
numOfCrossingTruck++; // ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๊ณ ์๋ ํธ๋ญ์ ์ ์ฆ๊ฐ
bridge.push(truck_weights.shift()); // ๋ค๋ฆฌ ๋งจ ๋ค ์์๋ฅผ 0 =>
} else {
// ์ฌ๋ผ๊ฐ ์ ์๋ค๋ฉด, 0์ ๋ฃ๊ธฐ
bridge.push(0);
}
seconds++;
}
return seconds;
}