프로그래머스 LV2 #1 다리를 지나가는 트럭

Jake Seo·2020년 7월 16일
0

프로그래머스 LV2

목록 보기
1/10

프로그래머스 LV2 #1 다리를 지나가는 트럭

문제

풀이

코딩테스트 문제는 문제의 조건에 따라 정리하는게 중요하다고 생각합니다.

최대한 문제를 간단하게 만들어보면,

  1. 다리 위에 다리가 견디는 하중만큼의 트럭을 올릴 수 있습니다.
  2. 트럭은 먼저 온 트럭이 다리 위에 먼저 올라갑니다.
  3. 트럭이 다리 길이만큼의 시간을 다리 위에서 상주하면 트럭은 지나갈 수 있습니다.
  4. 모든 트럭이 지나가는 동안 얼마만큼의 싸이클이 걸렸는지 파악하면 끝납니다.

저는 while문을 활용하여 모든 트럭이 지나갔고, 다리에 아무런 트럭이 없으면 반복을 끝내도록 하였습니다.

트럭은 오브젝트로 취급하였으며 각각이 truck_weight: 트럭의 무게time: 다리에 머무른 시간을 가지도록 하였습니다.

매 loop의 시작마다 트럭은 다리위에서 머문 시간인 time의 값을 1씩 늘려갑니다.

이후에 트럭이 다리 위에 올라갈 수 있는지에 대해 조건식으로 확인한 뒤 트럭이 다리에 올라갈 수 있으면, 트럭을 올립니다. 트럭이 올라가게 되면, 대기중인 트럭에서 삭제되며, 다리 위의 상주 시간은 0으로 세팅됩니다.

let solution = (bridge_length, weight, truck_weights) => {
    let counter = 0; // 사이클 횟수를 세는 용도
    let trucksOnBridge = []; // 다리 위에 있는 트럭을 가질 배열

    while(truck_weights.length !== 0 || trucksOnBridge.length !== 0){ // 다리 위에 트럭이 있거나 대기중인 트럭이 있다면 반복
        trucksOnBridge = trucksOnBridge.map((t) => ({"truck_weight": t["truck_weight"], "time":t["time"]+=1})); // 트럭의 다리 위 상주시간을 1 늘림
        trucksOnBridge = trucksOnBridge.filter((t) => t["time"] < bridge_length); // 다리 위의 상주시간이 다리 길이보다 작은 것들만 남김 (나머지는 다리를 건넌 것)
        
        // 다리 위에 올라갈 수 있는지 확인 후, 자리가 있다면 올림
        if(truck_weights.length !== 0 && (trucksOnBridge.reduce((a, c)=> +a + +c["truck_weight"], 0) + truck_weights[0]) <= weight ) trucksOnBridge.push({"truck_weight": truck_weights.splice(0, 1), "time": 0});
		        
        counter++;
    }

    return counter;
}
profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글