개발/코딩테스트

다리를 지나는 트럭

캐리캐리 2024. 12. 22. 19:07

문제 

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.

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

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

 

풀이 

1. 브릿지 길이가 2라면 트럭 하나가 지나는 시간은 2초임 

2. 브릿지 길이 만큼 queue에 넣고 빼는 과정을 해야함 

3. 이는 무한히 가능할 수 있으므로 while을 true로 하고 break 하는 방식으로 진행 

 

public static int solution(int bridge_length, int weight, int[] truck_weights){

	int answer=0;
    int truckSum =0;
    Queue<Integer> queue = new LinkedList<>();
    
    for(int i=0; i<truck_weights.length; i++){
    	int truck = truck_weights[i];
        
        while(true){
        	if(queue.isEmpty()){ //브릿지에 없으면 트럭 추가 
            	queue.add(truck);
                truckSum = truck;
            	break;
            }else if(queue.size() == bridge_length){ // 브릿지가 포화면 트럭 제거 
            	truckSum -= queue.poll();
                
            }else{
            	if(truckSum + truck <= weight){ //다음 트럭을 실을 수 있으면 트럭 추가 
					queue.add(truck);
                    truckSum+=truck;
					break;
                }else{ // 다음 트럭을 실을 수 없다면 0을 실어서 포화 상태로 만들어서 다음 뎁스에 탈출  
                	queue.add(0);
                    answer++;
                }
            }
        }
    }
    
    return answer + bridge_length; 
}