프로그래머스_다리를지나는 트럭 c++

hyoJeong·2021년 7월 16일
0

풀어본 문제:프로그래머스_다리를 지나는 트럭
문제링크:https://programmers.co.kr/learn/courses/30/lessons/42583

문제 해결 아이디어: 일단 프로그래머스 문제 위에 문제의 분류가 나와있기 때문에 큐 혹은 스택을 이용해 푸는것을 알고 있었다.
큐 or 스택 어떤것을 써야하는건가 고민하던중 문제를 보면 대기 트럭에 있는 순서대로 다리를 건너야 하는것을 볼수 있다.
큐는 가장먼저 들어온 것이 가정 먼저 나가는 FIFO 이기 때문에 큐를 쓰기로 결정했습니다.
그다음 어떤식으로 풀지 고민하던중. 다른 분이 문제해결 아이디어를 올려주신 것을 보고 참고했습니다.
1)큐를 만들어 다리 길이만큼 0을 삽입한다.
2)대기 트럭의 인덱스를 관리해줄 index 변수 선언
3) 큐가 비기 전까지 while 문을 돌리며 모든 트럭이 다리를 건널수 있도록 한다.
3-1) 큐안에 구현한 방법은 다리를 건너는 트럭의 무개를 관리할 total변수를 이용해 매초 나가는 트럭의 무개를 total에서 빼줍니다. 그런뒤, 맨 앞의 트럭의 무개와 total 변수의 합이 다리가 지탱할 수 있는 무게를 넘지 않는다면 큐에 해당하는 트럭을 넣어주고 index변수를 증가시킵니다. 만약 total변수와 대기 트럭에 존재하는 무개의 합이 다리가 견딜수 있는 무게를 넘어서는 경우 0을 삽입해줍니다.

if(index>=truck_weights.size()){
            continue;
        }

while 문 안에 위의 if문을 넣은 이유는 , 대기열에 존재한 트럭이 모두 들어갔을경우, 더이상 들어갈 트럭이 없기때문에, 새로운 트럭 값을 삽입하는 것을 멈추고 다리에 들어간 트럭이 큐에서 모두 나올때 까지의 시간을 측정해 출력하면 됩니다.

#include <string>
#include <vector>
#include <queue>
using namespace std;

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
   queue<int>q;
    for(int i=0;i<bridge_length;i++){
        q.push(0);
    }
    int tim=0;
    int total=0;
    int index=0;
    while(!q.empty()){
        
        total-=q.front();
        q.pop();
        tim++;
        if(index>=truck_weights.size()){
            continue;
        }
        if(total+truck_weights[index]<=weight){
            total+=truck_weights[index];
            q.push(truck_weights[index++]);
           
        }else{
            q.push(0);
        }
       
        
        
        
        
        
        
    }
    
    
    
    
    answer=tim;
    return answer;
}

0개의 댓글