본문 바로가기

개발공부/프로그래머스 뽀개기

[프로그래머스] 다리를 지나는 트럭 : 자바

<스택/큐>

 

 

🤞내가 푼 풀이( HINT )🤞

1. time을 저장할 배열 : 다리전체를 건너는것 체크 위해서

2. bridge 큐 : 말그대로 다리 역할. 다리에 올라가면 데이터 넣어주고 다리에서 빠져나오면 빼고

3. now : 현재 위치

4. first : 다리에서 처음에 있는 위치

5. sum_w : 다리에 올라가 있는 트럭들의 무게 총 합

 

💥각자 다리를 지나가는 시간을 time변수에 넣어주고

    first의 위치에 있는 time 값이 다리 길이랑 같아지면 큐(bridge)에서 빼냄. (1초 = 1만큼간다)

    그리고 first += 1을 해서 first값 이동

 

💥 다리가 지탱할수 있는 무게(weight) - 다리에 있는 트럭들의 합(sum_w)를 빼서 그다음 트럭 무게가 들어갈 수 있으면 

      큐에 값을 넣어준다 (= 그 다음 트럭을 시작한다).

 

💥 마지막으로 가는 애는 다리의 길이만큼 걸리니까 return 값에 그냥 다리 길이를 더해준다.

      while문은 마지막애가 다리올라가기 전까지만 돌리면 됨!

 

 public static void main(String args[]) {
//      int b_l = 2;
//      int weight=10;
//      int[] t_w = {7,4,5,6};
      
      int b_l =100;
      int weight=100;
      int[] t_w = {10,10,10,10,10,10,10,10,10,10};
   
      int ans = solution(b_l,weight,t_w);
      
      System.out.println("답"+ans); //8초
      
   }
   public static int solution(int bridge_length, int weight, int[] truck_weights) {
      int answer = 0;
      
      Queue<Integer> bridge = new LinkedList<Integer>();
      int[] time = new int[truck_weights.length];
      int first = 0;
      int sum_w;
      int now=0;

     
     do{
        
        if(time[first] == bridge_length && bridge.size() != 0) {
           //System.out.println("브릿지에서 이거빠진다:"+bridge.peek());
           bridge.poll();
           first +=1;
        }
        
        sum_w = 0;
        for(int i =first; i< now;i++) {
           sum_w += truck_weights[i];
        }
        
        if(bridge.size()<bridge_length && sum_w <= weight ) {//공간이 비어있고. 무게가 안넘으면.
           int a =weight-sum_w;
           if(a >= truck_weights[now]) {
              //System.out.println("브릿지에서 이거들어온다:"+truck_weights[now]);
              bridge.offer(truck_weights[now]);
              now += 1;
           }
           
           for(int i =first; i< now;i++) {
             time[i] +=1;
           }        
           answer += 1;
        }
        

      } while(now < truck_weights.length);
 
       return answer +bridge_length;
    }

하... 고생했던 문제...

쉬워보여서 간단히 도전했다가 엥 이게 아닌데 하고 몇번이고 엎어서 풀었다.

이와중에 자존심 상해서 답은 계속안봄ㅎㅎㅋ....

근데 뭔가 변수 너무 쓴것같기도... 나중에 다시 써봐야지