[lv2] 다리를 지나는 트럭

걸음걸음·2023년 3월 27일
0

Test

목록 보기
24/29

문제링크

  • 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return
  • bridge_length : 트럭이 최대 올라갈 수 있는 수, 다리를 건너는데 걸리는 시간
  • weight : 다리가 견딜 수 있는 무게(이하)
  • truck_weights : 건너야 하는 트럭 별 무게
function solution(bridge_length, weight, truck_weights) {
    const queue = []; // 다리를 건너는 트럭을 담을 큐 배열
    let time = 0; // return 할 값
    let totalW = 0; // 다리에 오른 트럭의 총 무게
    while(truck_weights.length || queue.length){
      // truck_weights와 queue에 남은 요소가 없을 때까지 반복
        if(queue.length){ // 다리를 건너는 중인 트럭이 있을 때
            if(queue[0][1] === time){
              // queue의 첫번째 요소(처음 들어온 트럭)이 다리를 모두 건널 시간과 걸린 시간이 같으면
                const end = queue.shift() // 해당 요소를 빼기
                totalW -= end[0];
            }
        }
        if(truck_weights.length){ // 대기중인 트럭이 있을 때
                if(totalW+truck_weights[0] <= weight && queue.length < bridge_length){
                // 현재 무게와 다음 들어올 트럭 무게가 다리가 견딜 수 있는 무게를 넘지 않을 때 + 다리가 견딜 수 있는 트럭 수를 넘지 않았을 때
                const now = truck_weights.shift();
                queue.push([now, time+bridge_length])
                // 트럭의 무게와 트럭이 나갈 시간을 queue에 추가
                totalW += now;
            }
        }
        time++;
    }
    return time;
}

다른 사람의 풀이

function solution(bridge_length, weight, truck_weights) {
  // '다리'를 모방한 큐에 간단한 배열로 정리 : [트럭무게, 얘가 나갈 시간].
  let time = 0, qu = [[0, 0]], weightOnBridge = 0;

  // 대기 트럭, 다리를 건너는 트럭이 모두 0일 때 까지 다음 루프 반복
  while (qu.length > 0 || truck_weights.length > 0) {
    // 1. 현재 시간이, 큐 맨 앞의 차의 '나갈 시간'과 같다면 내보내주고,
    //    다리 위 트럭 무게 합에서 빼준다.
    if (qu[0][1] === time) weightOnBridge -= qu.shift()[0];

    if (weightOnBridge + truck_weights[0] <= weight) {
      // 2. 다리 위 트럭 무게 합 + 대기중인 트럭의 첫 무게가 감당 무게 이하면 
      //    다리 위 트럭 무게 업데이트, 큐 뒤에 [트럭무게, 이 트럭이 나갈 시간] 추가.
      weightOnBridge += truck_weights[0];
      qu.push([truck_weights.shift(), time + bridge_length]);
    } else {
      // 3. 다음 트럭이 못올라오는 상황이면 얼른 큐의
      //    첫번째 트럭이 빠지도록 그 시간으로 점프한다.
      //    참고: if 밖에서 1 더하기 때문에 -1 해줌
      if (qu[0]) time = qu[0][1] - 1;
    }
    // 시간 업데이트 해준다.
    time++;
  }
  return time;
}

3번의 시간을 바로 업데이트 해주는 부분은 생각하지 못했다 해당 식을 사용하면 아무것도 하지 않고 시간만 업데이트하는 부분을 생략 가능, 좀 더 빠르게 식이 끝날 수 있을 것 같다

profile
꾸준히 나아가는 개발자입니다.

0개의 댓글