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

정승옥(seungok)·2020년 12월 21일
0

프로그래머스

목록 보기
23/40
post-thumbnail

문제설명

  • 트럭 여러 대가 일차선 다리를 정해진 순으로 건넘
  • 1초에 1만큼 움직이며 다리 길이는 bridge_length
  • 다리는 무게 weight까지 견딤
  • 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게를 고려하지 않음
  • 모든 트럭이 다리를 건러려면 최소 몇 초가 걸리는지 반환

제한조건

  • bridge_length는 1이상 10,000이하
  • weight는 1이상 10,000이하
  • truck_weights의 길이는 1이상 10,000이하
  • 모든 트럭의 무게는 1이상 weight이하

풀이

function solution(bridge_length, weight, truck_weights) {
    let answer = 0; // 계산할 시간
    let queSum = 0; // 현재 다리 무게
    let que = []; // 현재 다리 상태
    // 다리 상태 초기화
    for(let i=0;i<bridge_length;i++){
        que.push(0);
    }
    let nowTruck = truck_weights.shift();
    que.unshift(nowTruck); // 트럭 한대를 다리에 올림
    que.pop(); // 트럭이 올라왔으므로 한칸 당김
    queSum += nowTruck; // 현재 다리무게에 트럭무게를 더함
    ++answer; // 시간 1초 증가
    
    while(queSum){
        queSum -= que.pop(); // 앞으로 당김
        nowTruck = truck_weights.shift(); // 다음 트럭 꺼냄
        if(nowTruck + queSum <= weight){ // 다리무게를 초과하지 않으면 넣고 무게 추가
            que.unshift(nowTruck);
            queSum += nowTruck;
        }else{
            truck_weights.unshift(nowTruck); // 초과하면 다시 꺼낸 트럭을 넣음
            que.unshift(0); // 그 자리에 0을 넣음
        }
        ++answer; // 시간 1초 증가
    }
    return answer;
}

+ 내가 해결했던 코드 추가

function solution(bridge_length, weight, truck_weights) {
	const queue = new Array(bridge_length).fill(0); // 다리
	let time = 0; // 경과 시간
	let nowWeight = 0; // 현재 다리 위 트럭 무게

	queue.shift();
	queue.push(truck_weights[0]);
	nowWeight += truck_weights[0];
	truck_weights.shift();
	++time;
	// 첫번째 트럭은 다리에 바로 진입

	while (true) {
		const initial = truck_weights.shift();
		const out = queue.shift();
		nowWeight -= out;
		if (initial !== undefined) {
			if (nowWeight + initial > weight) {
				queue.push(0);
				truck_weights.unshift(initial);
			} else {
				queue.push(initial);
				nowWeight += initial;
			}
		}
		++time;
		if (truck_weights.length === 0) {
			time += queue.length;
			break;
		}
	}
	return time;
}

체크포인트

profile
Front-End Developer 😁

0개의 댓글