본문 바로가기

코딩 테스트/프로그래머스 코딩테스트

다리를 지나는 트럭

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

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

programmers.co.kr

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

using namespace std;

struct TRUCK_INFO{
    int weight = 0;
    int time = 0;
};

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
        
    
    // Vector
    vector<int> truck_wait;      // 대기하는 트럭들
    vector<TRUCK_INFO> truck_bridge;    // 다리 위에 있는 트럭들
    
    for(int i=0; i<truck_weights.size(); i++)
    {
        truck_wait.push_back(truck_weights[i]);
    }
    
    unsigned int time = 0;
    
    while(!truck_wait.empty() || !truck_bridge.empty())
    {
        // 다리 위에 있는 맨 앞의 트럭 시간 검사하고, 시간 넘으면 다리 위에 제거
        if(!truck_bridge.empty())
        {
            if(truck_bridge[0].time >= bridge_length)
            {
                truck_bridge.erase(truck_bridge.begin());
            }
        }
        
        // (다리 위에 있는 트럭들 + 바로 뒤에 있는 트럭)의 무게 계산
        int totalWeight = 0;
        
        for(int i=0; i<truck_bridge.size(); i++)
        {
            totalWeight += truck_bridge[i].weight;                           
        }

        // 바로 뒤에 대기하고 있는 트럭 무게 추가
        if(!truck_wait.empty())
        {
            totalWeight += truck_wait[0];
        }
        
        // 무게 검사하고, 무게 넘을 것 같으면 다리 위에 추가하지 않기
        if(totalWeight <= weight)
        {
            // 대기 중인 트럭이 비어있지 않을 때만
            if(!truck_wait.empty())
            {
                TRUCK_INFO truck_info;

                truck_info.weight = truck_wait[0];
                truck_info.time = 0;
                
                // 다리 위에 트럭 추가
                truck_bridge.push_back(truck_info);  
                
                // 대기 중인 앞 트럭 순서 제거
                truck_wait.erase(truck_wait.begin());   // pop the first data in the vector
            }
        }
        

        // 다리 위에 있는 트럭들의 시간 증가        
        for(int i=0; i<truck_bridge.size(); i++)
        {
            truck_bridge[i].time++;                                    
        }
        
        time++;
        
        // 시간 예외 처리
        const int max_time = 1000000;
        if(time > max_time)
        {
            break;
        }
        
        //////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////
        // PRINT...
//         printf("=====================\n");
//         printf("time = %d\n", time);
        
//         printf("Truck Bridge = ");
//         for(int i=0; i<truck_bridge.size(); i++)
//         {
//             printf("%d (%d), ", truck_bridge[i].weight, truck_bridge[i].time);            
//         }
//         cout << "\ntotalWeight = " << totalWeight << endl;
        
        //////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////

    }
    
    answer = time;
    cout << "answer = " << answer << endl;
    
    return answer;
}

'코딩 테스트 > 프로그래머스 코딩테스트' 카테고리의 다른 글

영어 끝말잇기  (0) 2022.11.29
[미해결] 괄호 회전하기  (0) 2022.11.27
다음 큰 숫자  (0) 2022.11.22
숫자의 표현  (0) 2022.11.22
[1차] 다트 게임  (0) 2022.10.29