[프로그래머스] - Level2 다리를 지나는 트럭

YS C·2021년 4월 20일
0

생각한 부분

  1. 주어진 조건 - 다리의 길이, 다리 위에 한 번에 올라갈 수 있는 무게, 트럭의 무게, 트럭은 1초에 1만큼 움직임
    (ex. 다리의 길이가 3이면 트럭이 다리를 다 지나가는데 최소 4초가 걸림)
  2. return 값은 모든 트럭이 다리를 다 지나가는 최소한의 시간
  3. 빈 배열(arr)에 다리의 길이만큼 0을 넣어준다... 왜? 트럭이 다리 위를 지나가는 시간을 체크하기 위해서!
  4. 다리 위에 올라 올 트럭이 남지 않은 경우 arrSum이 0이 될 때까지 arr.pop()만 진행(첫 번째 if문 실행 ❌) 시간(answer)을 체크한다 ! (다리에 남은 트럭을 빼주기만 하는 과정)
  5. 아직 다리 위에 올라올 트럭이 남은 경우 (truck_weights.length !== 0) 다음 트럭이 다리 위에 올라 올 수 있을지 없을지 체크 !
    5-1. 올라올 수 없는 경우 (arrSum + truck_weights[0] > weight) 다리에 0 하나 unshift로 추가
    5-2. 올라올 수 있는 경우 truck_wieghts 배열에 맨 앞에서 하나 뽑아 다리에 올려주고, 다리 무게도 추가해 준다.
  6. 반복

내가 쓴 코드

function solution(bridge_length, weight, truck_weights) {
  var answer = 0;
  const arr = [] 
  let arrSum = 0
  
  for (let i = 0; i < bridge_length; i++) {
    arr.push(0)
  }
  
  let leftPop = truck_weights.shift() 
  arr.pop()
  arr.unshift(leftPop)
  arrSum += leftPop
  answer++
  // 이 부분에 console.log(arr, arrSum, answer) 찍어보면 순서가 명확히 보입니다!
  
  while(arrSum) { 
    arrSum -= arr.pop()
    if (truck_weights.length !== 0) {
      if (arrSum + truck_weights[0] > weight) {
      arr.unshift(0)
    } else {
        leftPop = truck_weights.shift()
        arrSum += leftPop
        arr.unshift(leftPop)
      }
    }
    answer++
    // 이 부분에 console.log(arr, arrSum, answer) 찍어보면 순서가 명확히 보입니다!
  }
  return answer;
}

0개의 댓글