다리를 지나는 트럭 (ps반성)

연쇄코딩마·2021년 1월 29일
0
post-thumbnail

프로그래머스....

최근에 프로그래머스 2단계를 좀 풀어보고 있는데 좀 어렵다...... 정말 반성해야겠다. 열심히 꽉채워서 공부해야겠다.

설명 : 다리를 지나는 트럭

간단한 설명 : 먼저 트럭들이 무게 제한이 있는 다리를 건너는데 트럭은 최소 1초당 1만큼 움직일수 있고 다리의 길이, 다리지탱무게, 트럭무게을 인자로 받는 함수를 트럭들이 건너는데 필요한 시간을 리턴하는 함수이다.

먼저 예를 들어 설명하자면

경과 시간다리를 지난 트럭다리를 건너는 트럭대기 트럭
0[][][7,4,5,6]
1~2[][7][4,5,6]
3[7][4][5,6]
4[7][4,5][6]
5[7,4][5][6]
6~7[7,4,5][6][]
8[7,4,5,6][][]

이렇게 여러가지 고려할 사항이 많은 함수이다. 이 문제를 풀면서 아직 멀었구나 하는 생각이 많이 들었다.

입출력 예시

bridge_lengthweighttruck_weightsreturn
210[7,4,5,6]8
100100[10]101
100100[10,10,10,10,10,10,10,10,10,10]110

코드

function solution(bridge_length, weight, truck_weights) {
  let timeCount = 0;
  //총시간이다.
  let bridge = [];
  //다리를 지나는 트럭의 하중을 표시한 배열이다.
  let flag = true;
  let currWeight = 0;
  //현재하중을 다합친 배열
  
  for (let i = 0; i < bridge_length; i++) {
    bridge.push(0);
  }//처음부터 끝까지 하중이 0이되는 배열을 만든다.

  while (flag) {
    let shiftVal = bridge.shift();//일초가 지날경우 트럭이 빠져나오는 로직
    currWeight -= shiftVal;//=> 트럭이 빠져 나올 경우 하중을 빼준다.
    if (currWeight + truck_weights[0] > weight) {
      //다리의 현재 하중과 들어갈 트럭의 무게를 더한값을 다리무게와 비교해서 더 크다면 0을 푸쉬한다.
      bridge.push(0);
    } else {
      //그게 아니라면 현재 하중의 들어갈 트럭의 하중을 더하고 
      currWeight += truck_weights[0];
      bridge.push(truck_weights[0]);
      //다리위에 트럭이 올라가고
      truck_weights.shift();
      // 하나가 빠진다.
    }
    //한바퀴가 돌면 1초가 증가
    timeCount++;
    //만약에 트럭이 다 올라타고 트럭배열이 빈다면..
    if (truck_weights.length === 0) {
      for (let i = 0; i < bridge_length; i++) {
        timeCount++;//=> 제일 마지막 트럭이 다 통과할떄까지 초를 세어야한다.
      }
      flag = false;//그리고 이제 루프를 멈춘다.
    }
  }
  return timeCount;
}

좀 어렵지만 열심히 하면되겠지 ㅜㅠ

profile
只要功夫深,铁杵磨成针

0개의 댓글