
최근에 프로그래머스 2단계를 좀 풀어보고 있는데 좀 어렵다...... 정말 반성해야겠다. 열심히 꽉채워서 공부해야겠다.
설명 : 다리를 지나는 트럭
간단한 설명 : 먼저 트럭들이 무게 제한이 있는 다리를 건너는데 트럭은 최소 1초당 1만큼 움직일수 있고 다리의 길이, 다리지탱무게, 트럭무게을 인자로 받는 함수를 트럭들이 건너는데 필요한 시간을 리턴하는 함수이다.
먼저 예를 들어 설명하자면
| 경과 시간 | 다리를 지난 트럭 | 다리를 건너는 트럭 | 대기 트럭 |
|---|---|---|---|
| 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 | 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 timeCount = 0;
//총시간이다.
let bridge = [];
//다리를 지나는 트럭의 하중을 표시한 배열이다.
let flag = true;
let currWeight = 0;
//현재하중을 다합친 배열
for (let i = 0; i < bridge_length; i++) {
bridge.push(0);
}//처음부터 끝까지 하중이 0이되는 배열을 만든다.
while (flag) {
let shiftVal = bridge.shift();//일초가 지날경우 트럭이 빠져나오는 로직
currWeight -= shiftVal;//=> 트럭이 빠져 나올 경우 하중을 빼준다.
if (currWeight + truck_weights[0] > weight) {
//다리의 현재 하중과 들어갈 트럭의 무게를 더한값을 다리무게와 비교해서 더 크다면 0을 푸쉬한다.
bridge.push(0);
} else {
//그게 아니라면 현재 하중의 들어갈 트럭의 하중을 더하고
currWeight += truck_weights[0];
bridge.push(truck_weights[0]);
//다리위에 트럭이 올라가고
truck_weights.shift();
// 하나가 빠진다.
}
//한바퀴가 돌면 1초가 증가
timeCount++;
//만약에 트럭이 다 올라타고 트럭배열이 빈다면..
if (truck_weights.length === 0) {
for (let i = 0; i < bridge_length; i++) {
timeCount++;//=> 제일 마지막 트럭이 다 통과할떄까지 초를 세어야한다.
}
flag = false;//그리고 이제 루프를 멈춘다.
}
}
return timeCount;
}
좀 어렵지만 열심히 하면되겠지 ㅜㅠ