๐Ÿ”Žํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๊ฐ€๋Š” ํŠธ๋Ÿญ

๋ฐ•๋ฏผ์šฐยท2023๋…„ 7์›” 11์ผ
0

๋ฌธ์ œ: 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์˜ ๊ตฌ์กฐ์ธ ํ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

  1. ํ˜„์žฌ ๋‹ค๋ฆฌ์˜ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด์ธ bridge๋ฅผ ์ฃผ์–ด์ง„ ๋‹ค๋ฆฌ์˜ ๊ธธ์ด์ธ bridge_length ๋งŒํผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

    const bridge = new Array(bridge_length).fill(0);
  2. ์•„์ง ๋‹ค๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ์ด ์žˆ๊ฑฐ๋‚˜ && ์•„์ง ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๊ณ  ์žˆ๋Š” ํŠธ๋Ÿญ์ด ์žˆ๋‹ค๋ฉด ๋ฃจํ”„๋ฅผ ๊ณ„์† ๋ˆ๋‹ค.

    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++;
  3. ๋ฃจํ”„๊ฐ€ ๋๋‚˜๋ฉด, ์ด ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ 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;
}
profile
๊พธ์ค€ํžˆ, ๊นŠ๊ฒŒ

0๊ฐœ์˜ ๋Œ“๊ธ€