[프로그래머스] 다리를 지나는 트럭

Mr.뉴트리아·2021년 3월 4일
0

알고리즘

목록 보기
6/6

해당 문제는 큐 자료구조에 대한 기초적인 이해를 필요로합니다.

큐 자료구조?


당신은 세금처리를 위해 은행에 와 있습니다. 대기표를 뽑고 먼저 온 사람들의 업무가 끝날때까지 기다렸다가, 전광판에 자신의 번호가 나와서야 업무를 처리할 수 있죠. 당신보다 늦게 온 사람이 먼저 불려나가는 일은 좀처럼 없습니다. 이처럼 먼저 들어온 것이 먼저 나가는 방식을 FIFO(First In First Out)라고 부르고, 이것의 대표격이 바로 큐(Queue)알고리즘입니다.

문제의 해결 순서.

저는 문제의 순서를 3단계로 나누었습니다
1.트럭이 존재한다면, 모든 트럭을 한칸씩 땡긴다.
2.만약 다리에 트럭이 존재하지 않고, 대기 트럭이 없을 경우 진행된 시간을 리턴.
3.다리에 존재한느 모든 트럭의 무게 + 대기 트럭의 첫번째의 무게가 다리의 무게제한보다 같거나 작을 경우, 맨 앞에 있는 대기트럭을 다리에 올림.

이것을 반복하는 것으로 문제를 해결했습니다.

문제의 해결 코드

#include <string>
#include <vector>

using namespace std;

bool on_truck(vector<int> bridge)//트럭이 올라와있는지 검사
{
    int i = 0;
    while (i < bridge.size())
    {
        if (bridge[i] > 0)
            return true;
        i++;
    }
    return false;
}

void move_truck(vector<int>* bridge)//트럭을 한칸씩 땡기는 함수.
{
    int i = 0;
    while (i < bridge->size() - 1)
    {
        (*bridge)[i] = (*bridge)[i + 1];
        i++;
    }
    (*bridge)[i] = 0;
}
int on_truck_weight(vector<int> bridge)//다리에 있는 모든 트럭의 무게를 리턴.
{
    int i = 0;
    int weight = 0;
    while (i < bridge.size())
    {
        weight += bridge[i];
        i++;
    }
    return weight;
}

int solution(int bridge_length, int weight, vector<int> trucks) {
    int answer = 0;
    int time = 0;
    vector<int> bridge(bridge_length);
    while (true)
    {
        if (on_truck(bridge))
            move_truck(&bridge);
        else if (trucks.size() < 1)
            return time;
        if (trucks.size() > 0 && (on_truck_weight(bridge) + trucks.front()) <= weight)
        {
            bridge.back() = trucks.front();
            trucks.erase(trucks.begin());
        }
        time++;
    }
    return time;
}
profile
뉴트리아는 가시쥐과에 속하는 설치류의 일종이다. 오랫동안 뉴트리아과의 유일종으로 분류했지만, 현재는 가시쥐과에 포함시킨다. 늪너구리, 해리서 또는 코이푸라고도 한다. 뉴트리아는 스페인어로 수달을 의미하고, 출생지 남미에서는 이 종류를 코이푸라고 부른다.

0개의 댓글