프로그래머스

프로그래머스(다리를 지나는 트럭)풀이 C++

Shin_jisoo 2020. 11. 2. 14:14
728x90

programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

1) 주석 없는 version

#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    queue <int> q;
    int answer = 0;
    int bridgeOn=0;
    int i=0;
    
    while(1){
        
        answer++;
        
        if(q.size()==bridge_length){
            bridgeOn-=q.front();
            q.pop();
        }
        
        if(bridgeOn+truck_weights[i]<=weight){
            
            if(i==truck_weights.size()-1){
                answer+=bridge_length;
                break;
            }
            
            q.push(truck_weights[i]);
            bridgeOn+=truck_weights[i];
            i++;
        }
        
        else{
            q.push(0);
        }
    }
    return answer;
}

2) 주석 있는 version

#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    queue <int> q;
    int answer = 0; // 걸리는 시간
    int bridgeOn=0; // 다리위에 있는 트럭의 무게
    int i=0; 
    
    while(1){
        
        answer++; // while문이 반복되는 동안 계속 1씩 증가
        
        // queue의 크기가 다리의 길이와 같아지는 경우 = 트럭이 다리를 다 지났을 때
        if(q.size()==bridge_length){
            bridgeOn-=q.front(); // 다리 위 트럭의 무게에서 다 건넌 트럭의 무게 빼기
            q.pop(); // 다리위의 트럭에서 빼내기
        }
        
        // 새로 트럭이 올라왔을 때 전에 있던 트럭의 무게와 합한 것이 weight를 넘지 않을 경우
        if(bridgeOn+truck_weights[i]<=weight){
            
            if(i==truck_weights.size()-1){ // 트럭이 더이상 없을 경우
                answer+=bridge_length; // 마지막 트럭의 bridge_length 더해주기
                break; // 반복문 끝내기
            }
            
            q.push(truck_weights[i]); // 새로운 트럭 넣어주기
            bridgeOn+=truck_weights[i]; // 새로운 트럭 무게 bridgeOn에 더해주기
            i++;
        }
        
        //트럭의 무게가 weigth를 넘을 경우
        else{
            q.push(0); // 도착점으로 만들기
        }
    }
    return answer;
}