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

Lumi·2021년 12월 3일
0

알고리즘

목록 보기
50/59
post-thumbnail
function solution(bridge_length, weight, truck_weights) {
  let time = 0;
  let que = [];
  let queueSum = 0;

  for (let i = 0; i < bridge_length; i++) {
    que.push(0);
  }
  let now_truck = truck_weights.shift();

  que.unshift(now_truck);
  que.pop();

  queueSum += now_truck;

  time++;

  while (queueSum) {
    queueSum -= que.pop();

    now_truck = truck_weights.shift();

    if (now_truck + queueSum <= weight) {
      que.unshift(now_truck);
      queueSum += now_truck;
    } else {
      que.unshift(0);
      truck_weights.unshift(now_truck);
    }
    time++;
  }
  return time;
}

이런식의 큐 문제는 상당히 많다.

이런 문제를 풀때에는 일단 기본적으로

처음에 기초설정을 할지 vs 아니면 처음부터 바로 반복문을 돌릴지를 선택해야 한다.

  • 나 같은 경우에는 기초 설정을 하였다.

queueSum 은 다리에 있는 트럭의 총 무게를 종합하고 있고
나머지 변수들도 이름에 맞는 역할을 하고 있다.

일단 기본적으로 que를 다리로 명시적으로 보이게 하기 위해서 0을 넣어주었다.

  • 그후 트럭 이동에 따라서 배열을 조금씩 수정할 것이다.

그후 처음 트럭을 다리위에 올려놓고 시간을 1더해주었다.

그후 while문을 돌렸다.

일단 다음에 올라갈 트럭을 뺴온다.

  • 이 부분은 사실 안뺴와도 된다.
  • if문을 적용해 해당 값을 미리보고 필요할떄만 뺴도 된다.

뺴온뒤에 현재 다리위에 있는 무게와 뺴온 트럭의 무게를 합쳐보고 괜찮으면 다리에 올리고 아니면 다시 대기하는 의미에서 트럭 배열에 집어넣는다.

이 문제의 핵심을 흐름을 파악하는 것이다.

이런 종류의 큐 문제들이 모두 그렇다.

천천히 어떻게 진행이 되어야 하는지를 인식한다면 쉽게 해결할수 있는 문제라고 생각한다.

  • 물론 구현은 힘들수 있다
profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글