다리를 지나는 트럭


문제 파악


문제

🔖 프로그래머스 - 다리를 지나는 트럭


주요 조건

• 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는가?

• 다리에 완전히 오르지 않은 트럭의 무게는 무시한다.


입출력 예시

bridege_lengthweighttruck_weightsreturn
210[7,4,5,6]8
100100[10]101
100100[10,10,10,10,10,10,10,10,10,10]110
* bridege_length : 다리에 올라갈 수 있는 트럭의 수
* weight : 다리가 견딜 수 있는 무게
* truck_weights :트럭 별 무게 
* return : 모든 트럭이 다리를 건너는데 걸리는 시간(초)


문제 해결 과정


핵심 로직

큐가 비어있는지, 꽉차있는지, 1개 이상의 요소가 있는지에 대한 조건을 잘 생각해야 한다.

그리고 최대 무게를 초과할 경우에는 무게가 0인 가상의? 트럭객체를 큐에 삽입해줘야 한다.

이 부분을 생각하지 못 했다…😧😧😧

이 경우에는 for문을 종료하지 않아야 하며, 무게는 추가하지 않고 시간은 추가해줘야 한다.


해결 순서

⒈ Queue 생성

⒉ 조건에 맞는 로직 처리

조건실행 로직무게시간
큐가 비어있다면큐에 트럭 추가++
큐가 꽉 차 있다면큐에서 맨 앞 트럭 제거-+
큐에 자리가 있고, 트럭을 추가할 수 있다면큐에 트럭 추가++
큐가 자리가 있지만, 무게 초과로 트럭을 추가할 수 없다면0을 더한다.  


주요 함수

함수사용 목적비고
for 문하나의 트럭 단위로 로직이 실행되어야 함.-
remove큐의 첫 번째 요소를 제거 + 그 값을 반환큐가 비어 있는 경우 null을 반환
poll()큐의 첫 번째 요소를 제거 + 그 값을 반환큐가 비어 있는 경우 NoSuchElementException 에러 발생
peek()큐의 맨 앞에 있는 값 반환비어있는 경우 null을 반환
element()큐의 맨 앞에 있는 값 반환큐가 비어 있는 경우 NoSuchElementException 에러 발생


소스 코드


🔖 소스 코드

public class quiz42583 {

    public static void main(String[] args) {

        int bridge_length = 2;
        int weight = 10;
        int[] truck_weights = {7, 4, 5, 6};

        int answer = 0;
        Queue<Integer> q = new LinkedList<>();

        int max = 0;
        for (int truck_weight : truck_weights) {

            while (true) {

                // 1. 큐가 비어있을 경우
                if (q.isEmpty()) {
                    q.offer(truck_weight);
                    max += truck_weight;
                    answer++;
                    break;
                }

                // 2. 큐가 꽉 차있을 경우
                else if (q.size() == bridge_length) {
                    max -= q.poll();
                }

                // 3. 큐에 여유가 있을 경우
                else {
                    // 3-1. 다음 트럭이 들어오면 최대 무게를 초과하는 경우.
                    if (max + truck_weight > weight) {
                        q.offer(0);
                        answer++;
                    } 
                    // 3-2. 다음 트럭이 들어와도 최대 무게를 초과하지 않는 경우.
                    else { 
                        q.offer(truck_weight);
                        max += truck_weight;
                        answer++;
                        break;
                    }
                }
            }
        }
        System.out.println(answer + bridge_length);
    }
}

참고

마지막에 bridge_length를 결과에 더해줬다.

마지막 트럭이 다리에 올라가면 for문은 종료된다. 그런데 문제에서 원하는 결과는

모든 트럭이 다리를 지나는데 걸리는 시간(초)이다. 따라서 다리의 길이 만큼 더해주어야 한다.

뭔가 문제 설명이 부족한 느낌은 있었다. “트럭은 1초에 1만큼의 거리를 이동한다” 라는 조건이

더 있었다면 어떘을까? 라는 생각을 해본다.