문제 풀이/Programmers 문제 풀이

[Programmers, C++]#Level2_다리를 지나가는 트럭, 선형 자료구조, queue 컨테이너, deque 컨테이너

Hardii2 2024. 8. 22. 18:40


#1. 문제

 

프로그래머스

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

programmers.co.kr

 


 

#2. 풀이

 

1. queue

 

[Basic C++] #67_queue

[Basic C++] #67_queue C++의 STL에서 제공하는 queue 컨테이너에 대해 알아보겠습니다. Overview 개념 선언 멤버 함수 예제 #0. 개념 1. 큐 [자료 구조]#0_선형 자료구조 [자료 구조] #0_선형 자료구조 선형 자료

webddevys.tistory.com

C++의 STL에서 제공하는 queue 컨테이너는 선입 선출 방식으로 동작하는 순차 컨테이너로, 한쪽 끝에서 삽입 작업, 다른 한쪽 끝에서는 제거 작업만 이루어지는 컨테이너입니다.

 

2. deque

 

[Basic C++] #68_deque

[Basic C++] #68_deque C++의 STL에서 제공하는 deque 컨테이너에 대해 알아보겠습니다.  Overview 개념선언멤버 함수예제 #0. 개념1. 덱? [자료 구조]#0_선형 자료구조[자료 구조] #0_선형 자료구조 선형 자

webddevys.tistory.com

C++의 STL에서 제공하는 deque 컨테이너는 양쪽 끝에서 삽입/삭제/접근 작업이 가능한 순차 컨테이너입니다.

 

3. 나갈 트럭은 큐에서 손! 들어올 트럭은 덱에서 손!

  1. 먼저, 각 트럭의 인덱스를 queue 컨테이너에 순차적으로 삽입해줍니다.
  2. 큐가 빌 때까지 순회하며, 큐에서는 현재 다리에 트럭이 올라탈 수 있는지 확인하고, 덱에서는 현재 다리에 올라가 있는 트럭들 중 가장 먼저 올라탄 트럭이 지금 다리를 나갈 것인지 확인합니다.

 


 

#3. 코드

/*
    @링크: https://school.programmers.co.kr/learn/courses/30/lessons/42583
    @문제: 일차선 다리를 정해진 순서로 건널 때 모든 트럭이 다리를 건너는 최소 시간
    @설명
        1. queue 컨테이너, deque 컨테이너 활용
        2. queue 컨테이너만 활용
*/
#include <string>
#include <vector>
#include <queue>
#include <deque>

using namespace std;

typedef pair<int,int> p;

int solution(int bridge_length, int weight, vector<int> truck_weights) 
{
    //@트럭 목록
    queue<int> q;
    for(int i=0; i<(int)truck_weights.size(); ++i)
        q.push(i);
    //@다리
    deque<p> dq;
    //@시간
    int time = 1;
    //@다리의 현재 총 무게
    int curWeight = 0;

    //@트럭이 모두 다리에 올라탈 때까지 진행 
    while(!q.empty())
    {
        //@나갈 트럭이 있는가?
        if(!dq.empty())
        {
            //@다리에 첫 번째 올라온 트럭
            int firstTime = dq.front().first;
            int truck = dq.front().second;

            if((time - firstTime) >= bridge_length)
            {
                //@다리 총 무게 감소
                curWeight -= truck_weights[truck];
                //@다리에서 첫 번째 올라탄 트럭 나감
                dq.pop_front();    
            }
        }
        //@탈 트럭이 있는가?
        if(!q.empty())
        {
            //@첫 번째 순서의 트럭
            int truck = q.front();

            if(dq.size() < bridge_length
            && (curWeight + truck_weights[truck] <= weight))
            {
                //@다리 총 무게 증가
                curWeight += truck_weights[truck];
                //@다리에 트럭 올라감
                dq.push_back({time, truck});
                //@트럭 순서 제거
                q.pop();
            }
        }
        //@시간 증가
        time++;
    }
    //@다리 마지막에 올라간 트럭이 내릴때까지 걸리는 시간 더해준다.
    if(!dq.empty())
    {
        time += (bridge_length - (time - dq.back().first));
    }

    return time;
}