[프로그래머스/Level2] 다리를 지나는 트럭 (C++)

ziwon.k·2021년 6월 22일
1
post-thumbnail

[프로그래머스/Level2] 다리를 지나는 트럭 (C++)

1.문제


2. 접근/체크포인트

  1. 주어진 대기 순서대로 다리를 건너게 해야함 -> 큐 사용.
  2. 한 자동차가 다리를 건너는 동안 무게를 견딜 수 있다면 다음 자동차도 이어서 다리를 건너야 함.
  3. 마지막 자동차 순서에는 다리 길이만큼 + 해서 건너는 시간 계산.

3. 해결 방법

  1. truck_weights에서 자동차를 선택하기 위한 idx변수 사용.
  2. 현재 다리를 건너고 있는 자동차들의 무게를 계산하기 위한 sum 변수 사용.
  3. 현재 다리를 건너고 있는 자동차들을 체크하고, 자동차들이 다리를 건너는 시간을 계산하기 위한 큐 사용.
  4. 새로운 자동차가 다리에 진입할 때 +1초
  5. 새로운 자동차 진입 후, 대기중인 다음 자동차의 무게와 현재까지 진입한 자동차의 총 무게가 weight(다리가 견딜 수 있는 총 무게) 보다 작거나 같다면, 대기중인 다음 자동차 진입.
    5-1. 다음 자동차가 진입할 수 없다면 현재 진입한 자동차가 건너는 시간 count를 위해 큐에 0을 push
  6. 큐의 크기가 다리의 크기와 같아진다면 = 차가 다리를 다 건넜다면, 현재 총 무게에서 다 건너간 자동차의 무게를 제외하고, 다음 차량이 건널 수 있도록 idx를 증가 시킨다.
    7.위위 과정들을 반복하다, idx가 마지막 차량을 가리킬 때(idx==truck_weights.size()) answer에 다리의 길이를 +함으로써, 마지막 차량이 건너가는 시간까지 계산해준다.

4.전체코드

#include <queue>
#include <vector>

using namespace std;

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
    
    int idx=0;    //차량 지목용 idx
    int sum=0;   //현재 다리에 올라와있는 차량 무게 총합
    queue<int> q;  //현재 다리를 건너는 트럭 체크용 큐
    
    while(1){
        
        if(idx == truck_weights.size()){  //마지막 트럭일 때
            answer += bridge_length;  //마지막 트럭이 지나는 시간 추가
            break;  
        }
        
        answer++; //시간초 증가
        int tmp = truck_weights[idx];
        
        //차가 다리를 다 건넜을 경우
        if(q.size() == bridge_length){
            sum -= q.front();  //다 건넜으니 현재 다리에 있는 차들의 무게에서 제외
            q.pop();  
        }
        
        if(sum + tmp <= weight){  //다리에 다음 차가 진입할 수 있다면
            sum += tmp;  //차량 무게 추가
            q.push(tmp);  
            idx++;  //다음 차량을 위해서
        }else{   
            q.push(0);  //진입할 수 없다면 0을 푸시해서 시간초 계산
        }
    }
   
    return answer;
}


5. 참고사항

생략


6.다른 방법으로 풀어보기

생략


7. 후기

자동차가 꼭 대기 순서대로 진입해야하고, 한 번에 여러대가 건널 수 있어서 시간 카운트를 어떻게 해야할지 감 잡는데 오래 걸렸다. 엄청 복잡하게 생각한 것에 비해 코드는 간단했다.

profile
Frontend-Devloper

0개의 댓글