코딩테스트/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