[프로그래머스] 다리를 지나는 트럭(이중 배열로 다리 지나는 시간 풀이)

쿼카쿼카·2023년 3월 28일
0

알고리즘

목록 보기
46/67

코드

function solution(bridge_length, weight, truck_weights) {
    let ans = 0;
    const bridge = Array(bridge_length).fill(0);
    let total = 0;
    
    while(truck_weights.length) {
        ans++;
        total -= bridge.shift();
        
        if(total + truck_weights[0] <= weight) {
            const curTruck = truck_weights.shift();
            bridge.push(curTruck);
            total += curTruck;
        }
        else {
            bridge.push(0);
        }
    }
    
    return ans + bridge_length
}

// 훨씬 빠른 풀이
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;
}

처음 풀이

  • 길이 만큼의 배열을 만들고 트럭이 없으면 0으로 채워요
  • total보다 작으면 트럭 집어 넣고, 아니면 0 집어넣어요
  • 맨 앞 트럭 다 지나갈 때까지 기다려줘요!
  • 한 칸씩만 진행되어 트럭이 들어갈 수 없을 때 시간 허비가 커요

미친 풀이

  • time을 컨트롤 하는 닥터스트레인지
  • time = qu[0][1] - 1 로 세심한 컨트롤도 미친 듯...
  • 사실 이렇게 풀고 싶었는데 방법을 몰랐어요! 이중 배열로 풀어봐야겠어요
profile
쿼카에요

0개의 댓글