본문 바로가기
일반 학습/코딩 테스트

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

by StelthPark 2022. 3. 23.

처리조건

풀이

처리조건을 자세히봐야한다 bridge_length는 다리길이로 이 트럭은 1초에 1length만큼 움직이게 되며 weight는 다리위에 올라가 있는 트럭 자신의 무게들의 합보다 낮아야한다. 또한 truck_weight는 배열 순서대로 다리에 올라가게 된다.

 

트럭이 담긴 배열을 waitTruck으로 할당하고 모든 트럭이 다 지내가야끝나므로 while문을 우선 돌린다.

while문 내부에서 시작시 time을 1올리고 1초가 지날 때마다 트럭이 담긴 waitTruck에서 트럭을 빼서 다리에 올려야 하므로 for문을 길이만큼 돌린다. 현재 다리가 견딜 수 있는 무게는 nowWeight로 할당했고 지금 다리위에 올릴 트럭이 현재 견딜수 있는 무게보다 작거나 같은지 확인하여 다리에 올렸으니 nowWeight에 트럭자신의 무게를 빼주고 현재 다리에 트럭 당 현재 얼마나 다리를 지나갔는지 확인하는 nowBridStack에 초기 bridge_length를 기본값으로 푸시해주고 현재 다리에 있는 트럭들이 누구인지 확인하기 위해 nowWeiStack에 현재 올릴 트럭의 무게를 푸시한다. 왜냐면 트럭이 빠져나가면 이 배열에서 shift하여 다시 다리가 견딜 수 있는 무게인 nowWeight에 더해줘야 다음 트럭이 내가 올라 갈 수 있는지 확인해볼 수 있을 것이다.

 

여기서 break문을 잘써야한다. waitTruck[i]이 한번이라도 다리에 올라갈 수 있는 무게가 남아있는지에 대해 if문을 넘기지 못한다면 break를 해야 뒤에 남아있는 트럭이 제멋대로 먼저 다리에 올라가는것을 막을 수 있다. 하나의 트럭이라도 올라가면 break 또는 올라갈 트럭이 없다면 break해버리자.

 

그리고 1초마다 다리에 올라가자마자 다리를 건너기 시작하므로 스택에는 순서대로 쌓여있으므로 for문을 돌려 -1씩하자 for문으로 모든 다리에 올라간 트럭들이 -1를 적용해 이동했으니 if문으로 0인것들을 검색한다 두트럭이 동시에 나가는 경우는 없다 그러므로 배열에서 0을 검색하면 있다면 맨 앞 하나만 검색될것이고 shift로 없애고 nowWeiStack에서 맽앞 값인 무게를 shift하고 다리가 견딜 수 있는 무게인 nowWeight에 쌓자.

 

while문이 종료되는 조건은 현재 다리에 있는 트럭이 없어야하고 다리를 건너기전에 기다리는 트럭도 없어야한다. 또한 리턴을 해줄때 time은 아래처럼 다리를 다건넌 0이되는 순간 shift하고 바로 if문으로 검사하여 while문을 빠져나오므로 +1를 하여 리턴해줘야한다.

 

 

생각보다 오래걸렸다. 다 짜고 나서 테스트를 해보면 계속 오류가 났고 문제는 첫 for문에서 waitTruck[i]가 break문으로 조건을 안나가게 되면 뒤에 있는 무게가 낮은 트럭들이 순서에 상관없이 먼저 나가버릴수 있다는 것이다. 또한 두번째 for문에서 맨 앞에 다리를 다건너 0이된 nowBridStack의 0번째인덱스 검사문을 for문안에 넣었다. nowBridStack 길이가 for문의 조건을 받고있는데 내부에서 다리를 다 건너서 0이됐다고 shift를 해버리면 길이가 바뀌게되고 검사에 문제가 생긴다. 그래서 아차피 순서대로 1트럭씩 나가고 들어가는 상황이라 동시에 0이될 수없다는점을 이용해 외부에서 includes로 0이 있냐,없냐만 검사해서 모두가 -1를 처리해줘서 이동한 상황에서 다 건넌 버스를 shift하고 무게를 다시 복구시켜줬다.

 

function solution(bridge_length, weight, truck_weights) {
  let nowWeight = weight;
  let waitTruck = truck_weights;

  let nowWeiStack = [];
  let nowBridStack = [];
  let time = 0;

  while (true) {
 
    time += 1;
    for (let i = 0; i < waitTruck.length; i++) {
      if (nowWeight >= waitTruck[i]) {
        nowWeight -= waitTruck[i];
        nowBridStack.push(bridge_length);
        nowWeiStack.push(waitTruck.shift());
        break;
      } else if (nowWeight < waitTruck[i]) break;
    }
    for (let j = 0; j < nowBridStack.length; j++) {
      nowBridStack[j] -= 1;
     
    }
    if (nowBridStack.includes(0)) {
      nowBridStack.shift();
      nowWeight += nowWeiStack.shift();
    }
    if (nowBridStack.length === 0 && waitTruck.length === 0) break;
  }
  return time+1
}

'일반 학습 > 코딩 테스트' 카테고리의 다른 글

[프로그래머스] 카펫  (0) 2022.03.24
[프로그래머스] H-Index  (0) 2022.03.24
[프로그래머스] 위장  (0) 2022.03.22
[프로그래머스] 괄호 회전하기  (0) 2022.03.22
[프로그래머스] 예상 대진표  (0) 2022.03.21

댓글