다리를 지나는 트럭

PearLine_Zero·2024년 5월 8일

하루에 1커밋 CodingTest

목록 보기
87/110
post-thumbnail
  • 티어 : Lv. 2
  • 정답여부 : 오답

💡문제

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

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

경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
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][] []
따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

💡입출력 예

💡문제요약

  • 트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순서로 건너는데 모든 트럭이 다리를 건너면 몇초가 걸리는지 알아내면 되는 문제
  • (다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있다고 함)

💡알고리즘 설계

  • bridge_list : 다리
  • bridge_wegith : 다리에 올라가는 무게
  • answer : 시간
  1. bridge_list 가 비어있는 경우 offer하여 트럭을 추가하며 answer 추가
  2. bridge_list가 length와 같은 경우 다리가 꽉찬 것으로 poll을 하여 처음에 들어온 트럭을 빼줌
  3. bridge_list에 트럭이 꽉차지 않았지만 현재 트럭의 무게와 뒤에 트럭에 무게가 weigth를 넘어가는 경우 0을 추가하여 answer ++ 안 넘어가는 경우 뒤에 트럭을 넣어주고 answer ++

💡작성코드

  • Java
import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int bridge_weight=0;
        Queue<Integer> bridge_list  = new LinkedList<Integer>();
        for(int i = 0; i < truck_weights.length; i++){
        while(true){
            //다리에 트럭 없는 경우
            if(bridge_list.isEmpty()){
                bridge_list.offer(truck_weights[i]);
                bridge_weight+=truck_weights[i];
                answer++;
                break;
            }
            //다리가 꽉 찬 경우
            else if(bridge_list.size()==bridge_length){
                bridge_weight-=bridge_list.poll();
            }
            else{
                //다리에 트럭을 실을 수 있을 경우
                if(bridge_weight+truck_weights[i]<=weight){
                    bridge_list.offer(truck_weights[i]);
                    bridge_weight+=truck_weights[i];
                    answer++;
                    break;
                }
                else{
                    //다리에 트럭 무게가 초과인 경우
                    //가상으로 0을 채워줌
                    bridge_list.offer(0);
                    answer++;
                }
                }
            }
        }
        return answer;
    }
}

💡시간복잡도

O(n + 다리 길이)

💡틀린 이유 or 수정할 부분

테스트 결과 틀렸다고 나와서 당황했다. 뭐지 왜 정확한 결과값이 안 나왔지 보던중 마지막 트럭이 빠져나오는 시간을 깜박한 것이다. 다시 코드를 수정했다.

💡틀린 부분 수정 or 다른풀이

  • Java
import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int bridge_weight=0;
        Queue<Integer> bridge_list  = new LinkedList<Integer>();
        for(int i = 0; i < truck_weights.length; i++){
        while(true){
            //다리에 트럭 없는 경우
            if(bridge_list.isEmpty()){
                bridge_list.offer(truck_weights[i]);
                bridge_weight+=truck_weights[i];
                answer++;
                break;
            }
            //다리가 꽉 찬 경우
            else if(bridge_list.size()==bridge_length){
                bridge_weight-=bridge_list.poll();
            }
            else{
                //다리에 트럭을 실을 수 있을 경우
                if(bridge_weight+truck_weights[i]<=weight){
                    bridge_list.offer(truck_weights[i]);
                    bridge_weight+=truck_weights[i];
                    answer++;
                    break;
                }
                else{
                    //다리에 트럭 무게가 초과인 경우
                    //가상으로 0을 채워줌
                    bridge_list.offer(0);
                    answer++;
                }
                }
            }
        }
        //마지막 트럭이 빠져나오는 시간
        answer +=bridge_length;
        return answer;
    }
}

💡느낀점 or 기억할 정보

처음에 문제를 이해하는데도 시간이 걸렸고 코드를 구현하는데도 조금 힘들었다 매일 문제를 풀면 3시간씩은 걸리는거 같다 ㅠㅠ 어떻게 하면 빠르게 읽고 구현을 할 수 있는지 모르겠다.

profile
https://baesaa0304.tistory.com 블로그 이사합니다~

0개의 댓글