[Java] 다리를 지나는 트럭

allzeroyou·2025년 1월 26일

Java-Algorithm

목록 보기
18/26
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/42583?language=java

문제 설명

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려고 함.
모든 트럭이 다리를 건너려면 최소 몇 초?

  • 다리에 트럭 개수 최댓값: bridge_length
  • 다리 최대 하중: weight
  • 다리에 완전히 오르지 않은 트럭 무게 무시

풀이

  • q: bridge_length 사이즈만큼의 큐(FIFO 사용) 자료구조를 생성.

  • sum: 다리에 올라온 트럭 무게 합

트럭 무게만큼 for 문 순회하면서,
while(true):

  • 만약, 큐가 비어있다면(트럭이 올라올 칸 수가 남아있다면): 다음 트럭 삽입(시간+1)

  • 그렇지 않고, 큐가 꽉 찼다면: 제일 앞에거 추출

두 경우 모두 아니라면:

  • (다리 최대 하중< 트럭 무게 합+현재 트럭 합이 더 크다면,, 다음 트럭 추가 x)->
(weigth < sum + truck):
q.offer(0);
answer++;(시간+1)
  • 다음 트럭까지 더해도 최대 하중 이내일때 큐에 추가
q.offer(truck);
sum+=truck;
answer++;(시간+1)

정답코드

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        
        Queue<Integer> q = new LinkedList<>(); // 다리: 큐
        int sum = 0; // 다리에 올라온 트럭 무게 합
        
        for(int truck: truck_weights){
            while(true){
                // 큐가 비었다면
                if(q.isEmpty()){
                    q.offer(truck);
                    sum += truck;
                    answer ++; 
                    break;
                }
                // 큐가 꽉 찼다면
                else if(q.size()==bridge_length){
                    sum -= q.poll();
                }
                // 큐가 비어있지 않다면
                else{
                    if(weight < sum+truck){
                        q.offer(0);
                        answer ++; // 해당 트럭 건너는 시간 추가
                    }
                    else{
                        q.offer(truck);
                        sum+= truck;
                        answer++;
                        break;
                    }
                }
            }
        }
        
        // 걸린 시간 + 마지막 트럭까지 건너는 시간
        return answer+bridge_length;
    }
}```


profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글