코딩테스트/Programmers (프로그래머스)

[프로그래머스] 다리를 지나는 트럭 - Javascript (Lv.2)

지윤공원🌳 2021. 4. 29. 19:45
728x90

📖 문제 설명

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
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_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.
bridge_length weight truck_weights return
2 10 [7,4,5,6] 8
100 100 [10] 101
100 100 [10,10,10,10,10,10,10,10,10,10] 110

 

💻 나의 코드

function solution(bridge_length, weight, truck_weights) {
    let second = 0; // return해줄 시간(초단위)를 초기화
    let bridge = new Array(bridge_length).fill(0 // bridge(다리)를 표현할 배열을 bridge_length만큼 0으로 채워서 초기화
                                               
    // truck_weights(대기 트럭)의 길이가 0이 넘을 때만 반복문 수행                                           
    while(truck_weights.length > 0){
        bridge.shift(); // bridge의 첫 번째 값을 제거 (다리를 지났다는 뜻)
        
        // reduce함수를 통해 bridge(다리) 위에 있는 트럭들의 무게합을 구함
        let sum = bridge.reduce((acc, cur) => acc + cur); 
        
        // 무게합과 대기 트럭 중 가장 앞에 있는 트럭의 무게를 더했을 때 weight이하라면
        if(truck_weights[0] + sum <= weight) { 
            bridge.push(truck_weights[0]); // bridge에 대기 트럭 중 가장 앞에 있는 트럭을 올립니다 (건너게 한다)
            truck_weights.shift(); // truck_weights에서 다리로 올라간 트럭을 제거합니다
        }else{ // 무게합과 대기 트럭 중 가장 앞에 있는 트럭의 무게를 더했을 때 weight가 넘는다면
            bridge.push(0); // bridge에 0을 추가합니다. (아무 트럭도 올라가지 않은 것을 표현)
        }
        second++; // while문이 반복될 때마다 second를 증가시킵니다
    }
    // second와 bridge_length를 더해서 return (bridge_length를 더하는 이유는 마지막 트럭이 다리를 끝까지 건너는 것을 표현하기 위해)
    return second + bridge_length; 
}

 

🎤 코드 설명

  • return해줄 값 second를 0으로 초기화합니다.
  • bridge(다리)를 표현할 배열을 bridge_length만큼 0으로 채운 후에 초기화를 합니다.
  • while문을 통해서 truck_weights의 길이가 0이하일 때까지 반복문을 수행합니다.
    • bridge의 첫 번째 값을 제거합니다. (첫 번째 값은 도착 지점에 가깝다는 뜻으로 shift()수행 시 다리를 지난 것입니다.)
    • reduce함수를 통해서 다리 위에 있는 모든 트럭의 무게합을 구해서 sum에 초기화합니다.
    • 무게합과 대기 트럭 배열 중 가장 빠른 순서인 트럭의 무게를 더했을 때, weight이하인지 확인합니다.
      • 이하라면 ⇒ bridge에 대기 트럭 배열 중 가장 빠른 순서인 트럭을 다리에 올립니다.
      • 대기 트럭 배열 중 가장 빠른 순서인 트럭이 다리에 올라갔으므로 배열에서 제거합니다.
      • 이하가 아니라면(초과) ⇒ bridge에 0을 더해줍니다. (대기 트럭 배열의 트럭들 중 아무 트럭도 다리에 올라가지 못한 겁니다. )
    • while문이 반복될 때마다 second를 1씩 증가시킵니다.
  • second와 bridge_length를 더해서 return합니다. (bridge_length를 더하는 이유는 마지막 트럭이 다리를 끝까지 건너는 것을 의미합니다.)

 

📜 채점 결과

정확성: 100.0

합계: 100.0 / 100.0

 

💬 배운 것

  • 자료구조 큐(queue)의 원리에 대해서 복습할 수 있었습니다. 
  • 큐의 대표적인 특징인 First In First Out을 문제에 적용해봤습니다. 

 

 

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

 

728x90