|
| 1 | +// https://school.programmers.co.kr/learn/courses/30/lessons/42583 |
| 2 | + |
| 3 | +// 방법 1: 공간 관점 풀이(다리를 배열로 표현하여 물리적 공간을 시뮬레이션) |
| 4 | +function solution1(bridge_length, weight, truck_weights) { |
| 5 | + // 다리의 전체 칸을 0으로 초기화 (각 칸이 다리의 실제 위치를 표현) |
| 6 | + const bridge = Array(bridge_length).fill(0); |
| 7 | + let current_weight = 0; |
| 8 | + let time = 0; |
| 9 | + |
| 10 | + while (truck_weights.length > 0 || current_weight > 0) { |
| 11 | + // 매 초마다 맨 앞 칸의 트럭(또는 0)을 제거하여 이동 표현 |
| 12 | + current_weight -= bridge.shift(); |
| 13 | + |
| 14 | + // 다리에 새 트럭을 진입시킬 수 있는지 확인 |
| 15 | + if ( |
| 16 | + truck_weights.length > 0 && |
| 17 | + current_weight + truck_weights[0] <= weight |
| 18 | + ) { |
| 19 | + const new_truck = truck_weights.shift(); |
| 20 | + bridge.push(new_truck); |
| 21 | + current_weight += new_truck; |
| 22 | + } else { |
| 23 | + bridge.push(0); // 트럭이 진입할 수 없으면 빈 공간(0) 추가 |
| 24 | + } |
| 25 | + |
| 26 | + time++; |
| 27 | + } |
| 28 | + |
| 29 | + return time; |
| 30 | +} |
| 31 | + |
| 32 | +// 방법 2: 시간 관점 풀이(각 트럭의 진입 시간을 기록하여 이동 시간을 계산) |
| 33 | +function solution2(bridge_length, weight, truck_weights) { |
| 34 | + // 다리 위 트럭들의 [무게, 진입시간]을 저장하는 큐 |
| 35 | + const queue = []; |
| 36 | + let time = 0; |
| 37 | + let current_weight = 0; |
| 38 | + |
| 39 | + while (truck_weights.length > 0 || queue.length > 0) { |
| 40 | + time++; |
| 41 | + |
| 42 | + // 선두 트럭의 이동 시간이 다리 길이와 같아지면 다리에서 제거 |
| 43 | + if (queue.length > 0 && time - queue[0][1] === bridge_length) { |
| 44 | + current_weight -= queue.shift()[0]; |
| 45 | + } |
| 46 | + |
| 47 | + // 새 트럭의 진입 시간과 무게를 큐에 기록 |
| 48 | + if ( |
| 49 | + truck_weights.length > 0 && |
| 50 | + current_weight + truck_weights[0] <= weight |
| 51 | + ) { |
| 52 | + const truck = truck_weights.shift(); |
| 53 | + queue.push([truck, time]); |
| 54 | + current_weight += truck; |
| 55 | + } |
| 56 | + } |
| 57 | + |
| 58 | + return time; |
| 59 | +} |
0 commit comments