다리를 지나는 트럭 from 프로그래머스(javascript)

JellyChoco·2020년 7월 21일
0

문제

해석

자료구조 Queue에 관련된 문제인것 같고
해석할것이 따로 없었다.

풀이

정답이 아닌 풀이 입니다.

프로그래머스 상 테스트케이스도 14개 중 5개를 통과를 못했습니다.

그래도 이렇게 시도했던 사람도 있구나 하고 참고만 하시길 바랍니다.

function solution(bridge_length, weight, truck_weights) {
  let time = 0;
  let presentWeightOfBridge = 0; //다리의 현재 무게
  let passedBridge = []; //다리를 지난 트럭들을 담을 배열
  let target = truck_weights.slice(); //while문을 멈추는 브레이크 조건
  // 다리를 지나기전 트럭들을 모아둔 배열과 다리를 지난 트럭들을 모아둔 배열을 비교해서 동일하다면
  // 모두 정상적으로 지나간 것이라고 판단하기 위해 깊은 복사한 배열
  let waitingTrucks = truck_weights; //편의상 이름을 바꿨다.
  let bridge = []; //말그대로 다리이며
  for (let i = 0; i < bridge_length; i++) { //다리의 길이만큼 0을 채웠다. 
    bridge.push(0);
  } 

  while (true) {
    if (waitingTrucks[0] + presentWeightOfBridge > weight) { //다리위 무게가 초과된 경우
      // waitingTrucks[0] 은 이제 막 들어오려고 하는 트럭 
      // presentWeightOfBridge 은 다리의 현재 무게 현재는 아무 트럭도 다리위에 없으니 0
      // weight 는 매개변수로 주어진 다리의 최대 무게
      if (bridge[0] !== 0) { //다리의 끝에 있는 것이 숫자 0 이 아니라면 트럭이라고 보고
        passedBridge.push(bridge.shift()); //다리에서 뺴서 도착트럭배열에 넣어준다
        presentWeightOfBridge = presentWeightOfBridge - passedBridge[passedBridge.length - 1];
        //다리에서 트럭이 나왔다면 다리의 무게를 줄여준다
      } else {//만약 다리 마지막에 있는것이 트럭이 아니라면
        bridge.shift(); //그냥 제거해주고
      }
      bridge.push(0); // 0을 넣어 에스컬레이터처럼 하나씩 밀어주게끔 했다
    }
    
    if (waitingTrucks[0] + presentWeightOfBridge <= weight) { //다리위 무게가 초과되지 않은 경우
      if (bridge[0] !== 0) {
        passedBridge.push(bridge.shift());
        presentWeightOfBridge = presentWeightOfBridge - passedBridge[passedBridge.length - 1];
      } else {
        bridge.shift();
      }

      bridge.push(waitingTrucks.shift()); //무게가 초과하지 않으니 기다리고 있던 트럭을 넣어주고
      presentWeightOfBridge = presentWeightOfBridge + bridge[bridge.length - 1]; //트럭의 무게를 더해준다
    } else if (!waitingTrucks.length) { //만약 모든 트럭이 다리를 지났거나, 지나고 있는 경우
      if (bridge[0] !== 0) {
        passedBridge.push(bridge.shift());

        presentWeightOfBridge = presentWeightOfBridge - passedBridge[passedBridge.length - 1];
      } else {
        bridge.shift();
      }

      bridge.push(0);
    }

    time = time + 1; //위의 과정을 모두 한번은 겪고 이리로 올테니 시간을 1초 올려준다

    console.log({
      waitingTrucks,
      bridge,
      presentWeightOfBridge,
      time,
      passedBridge,
    });
    if (JSON.stringify(target) === JSON.stringify(passedBridge)) { //출발하기 전 트럭들과
                                                                    //도착한 트럭들이 동일하다면
      return time; //while문을 빠져나가면서 시간을 반환해준다.                                                
      }
  }
}

주어진 이 표를 그대로 구현하고 싶었고,

결과적으로

이렇게 주어진 예제와 동일한 console.log를 얻었다

후기

알고리즘이 너무 취약하기에 남들보다 더 시간이 걸렸을게 뻔하고 정답도 아니지만, 어느정도 풀었다는 것 자체가 재밌었다.
사실 정답까지 구하고 싶은데 어떤 테케에서 막혔는지를 모르겠어서 그냥 패스하려고 한다.
그래도 원하던 console.log를 얻어 좋았던 문제였다.

profile
코린이? 개린이!

0개의 댓글