코딩 테스트/프로그래머스 level2

다리를 지나는 트럭

fullfish 2022. 9. 9. 00:22

코드

function solution(bridge_length, weight, truck_weights) {
  let bridgeTemp = Array(bridge_length).fill(0);
  let second = 0;
  while (truck_weights.length > 0) {
    bridgeTemp.unshift(0);
    bridgeTemp.pop();
    const bridgeTempSum = bridgeTemp.reduce(function add(sum, cur) {
      return sum + cur;
    }, 0);
    if (bridgeTempSum + truck_weights[0] <= weight) {
      bridgeTemp[0] = truck_weights.shift();
    }
    second++;
  }
  return second + 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;
}

'코딩 테스트 > 프로그래머스 level2' 카테고리의 다른 글

카펫  (0) 2022.09.09
다음 큰 숫자  (0) 2022.09.09
피보나치 수  (0) 2022.09.08
숫자의 표현  (0) 2022.09.08
올바른 괄호  (0) 2022.09.08