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

이명진·2022년 4월 21일
0

코드카타

목록 보기
22/69

스택과 큐 문제이다.
대기 트럭 배열과 다리의 길이, 다리가 견딜수 있는 무게가 주어진다.

다리에는 다리가 견딜수 있는 무게만큼 트럭이 올라갈수 있다.
문제가 좀 애매해서 풀기가 좀 힘들었다.

처음에는 다리에 트럭이 올라가면 카운트를 세었는데 틀려서 다시 해설을 보니
시간마다 다리의 길이 1만큼 이동하는것 같다.

애매하게 자꾸 틀리고 풀수 있을거같아서 4~5 번째 도전 끝에 문제를 풀수 있었다.

처음 풀이

function solution(bridge_length, weight, truck_weights) {
    let cnt = 0;
  	let bridge =[];
  let cross=[];
  let nowWeight=0;
  if(truck_weights.length===1){
    return weight+1
  }
while(truck_weights.length>0){
  
  let truck=truck_weights.shift();
 

  if (bridge.length===0 || nowWeight<weight){
       nowWeight+=truck
    bridge.push(truck)
    cnt++

  }
if(nowWeight>=weight){
 cross.push(bridge.shift());
  nowWeight-= cross[cross.length-1]
  cnt+=bridge_length
}

}
    return cnt;
}

트럭 대기열에서 하나씩 빼서 다리에 올리고 다리 무게를 체크한다음에
넘어간 트럭 배열을 만들어서 넣어주었다.
문제가 풀리지 않았다.

두번째 풀이

문제를 이해를 못한것 같아서 두번째 풀이때는 뭘 적용해야 하는지 
작성해 보면서 풀었다. 
function solution(bridge_length, weight, truck_weights) {
    let cnt = 0;
  	let bridge =[];
  let cross=[];
  let nowWeight=0;
  let len = truck_weights.length
  if(truck_weights.length===1){
    return weight+1
  }

while(cross.length !== len-1){
  // 트럭 선정 
  // 다리가 비어 있고 트럭 무게가 다리 무게보다 낮을때 다리에 푸시 
  // 다리가 차있고 트럭 무게가 다리무게 보다 높을때 앞차 빼기 
  // 다리에 올라 가거나 건넜을때 시간 초 up 
  
  let truck=truck_weights.shift();
  
  console.log(nowWeight,truck,bridge,cross,cnt) 
  if(!bridge.length){
    //다리가 비어있을때 
    bridge.push(truck)
    nowWeight+=truck
    cnt++
  }else{
    nowWeight+=truck
    if(nowWeight<=weight){
       bridge.push(truck)
        cnt++
    }else{
      //다리가 무게 넘었을때 
     cross.push(bridge.shift());
    	 bridge.push(truck)
      nowWeight-= cross[cross.length-1]
        cnt+=bridge_length
    }
  }


}
    return cnt;
}

이와같이 풀어도 문제가 풀리지 않아서 질문하기에서 테스트 케이스를 추가해보도록 하였다.

질문하기 내에서도 문제에 대한 불만들이 많이 나왔다.

거기서 힌트를 얻게 된것은 다리 배열에 공기가 있는것처럼
0으로 채우고 한칸씩 한칸씩 이동하게 하여서 문제를 풀라는 것이었다.

다리배열 내에서도 스택과 큐를 사용하고
트럭 배열에서도 스택과 큐를 사용해야 하는 것이었다.
심기 일전하고 다시 문제를 풀었다.

세번째 풀이

function solution(bridge_length, weight, truck_weights) {
    let cnt = 0;
  	let bridge = new Array(bridge_length).fill(0)
  let cross=[];
  let nowWeight=0;
  let len = truck_weights.length
  if(truck_weights.length===1){
    return weight+1
  }

while(cross.length<len){
// 다리 한칸씩 이동 (공기 혹은 트럭)
  let go = bridge.shift();
  if(go){
//만약 공기(0)이 아니면 건너간 배열에 넣어준다. 
    cross.push(go)
    nowWeight-=go;
  }
  let truck = truck_weights.shift();
    nowWeight+=truck;
  if(nowWeight<=weight){
  //트럭 무게를 견딜수 있을때 다리에 트럭을 넣는다. 
     bridge.push(truck);
  }else{
// 아닐때에는 트럭을 다시 배열에 넣어주고 공기를 채워준다. 
    truck_weights.unshift(truck)
    nowWeight-=truck;
     bridge.push(0);
  }
cnt++
}
    return cnt;
}

결국에는 통과할수 있었다.

까다로운 문제 였지만 스택과 큐 부분을 이해한것 같아서 다행스럽기도 했다.
다른 사람들의 풀이를 드디어 볼수 있었다.

코드를 가져오지는 않았다. 문제를 풀고 확인 해 보면 좋을것 같다.

패터쓴씨가 푼 해답이었는데.
나처럼 공기를 넣어 놓는 무식한 방법은 아니었고
트럭마다 도착 시간을 구한다음에
다리가 견디는 무게 만큼 찼을 경우 시간 점프를 하였다.
진짜 획기적으로 문제를 푼것 같다.

퍼포먼스 측면에서도 훨씬 좋을것 같다.
이문제를 풀기 위해서 5일 정도 소요한것 같은데
이정도로 풀려면 정말 이해력과 센스가 대단해야 할것 같다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글