🔥 Algorithm/Programmers

[프로그래머스] 다리를 지나는 트럭 (js)

Lennon 2022. 2. 10. 12:33
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/42583?language=javascript 

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

function solution(bridge_length, weight, truck_weights) {
  truck_weights = truck_weights.map((v) => [v, 0]);
  const passingTruck = [];
  const passedTruck = [];

  const len = truck_weights.length;
  let count = 1;

  while (passedTruck.length !== len) {
    count++;

    if (truck_weights.length > 0) {
      passingTruck.push(truck_weights.shift());
    }
    
    const truckWeight = passingTruck.reduce((prev, cur) => prev + cur[0], 0);

    if (truckWeight > weight) {
      truck_weights.unshift(passingTruck.pop());
    }

    passingTruck.map((v) => v[1]++);

    if (passingTruck[0][1] === bridge_length) {
      passedTruck.push(passingTruck.shift());
    }
  }

  return count;
}

 

truck_weights [7,4,5,6]을 [ [7,0], [4,0], [5,0], [6,0] ] 형태로 바꾼다.

 

passingTruck 

지나가는 트럭을 넣는 배열

 

passedTruck

트럭이 지나가면 넣는 배열

 

count

시간을 재는 변수

 

while 내부 로직

count는 계속 1씩 더해준다.

 

1. truck_weights 배열의 길이가 0이 아니면 truck_weight 입력 배열에서 shift 하여 passingTruck에 push 한다.

 

2. passingTruck의 들어가 있는 트럭들의 무게(truckWeight)를 구한다.

 

3. truckWeight가 weight를 넘으면 passingTruck 배열에서 pop을 하고, 그 값을 다시 truck_weights 배열에 넣는다.

 

4. passingTruck 배열의 모든 인덱스를 순회하며 [1] 값에 1씩 더한다. ex) [7, 0] => [7, 1]

 

5. 순서대로 들어오므로 passingTruck[0][1] 값이 bridge_length값이 되면

    passingTruck에서 shift 하며 그 값을 passedTruck에 push 한다.

 

6. passedTruck의 배열 길이가 처음 제공된 truck_weights 길이가 되면 while문을 종료한다.

728x90
반응형