프로그래머스/lv2/42583. 다리를 지나는 트럭

SITY·2023년 10월 31일
0

Cpp_Algorithm

목록 보기
38/43

#include <string>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;

typedef struct {
    int time;
    int w;
} info;

int solution(int len, int w, vector<int> v) {
    queue<int> q;
    info arr[10001];
    memset(arr, 0, sizeof(arr));
    int i = 0, sec = 0, max = 0;
    do {
        sec++;
        if (!q.empty() && arr[q.front()].time + len <= sec) {
            max -= arr[q.front()].w;
            q.pop();
        }
        if (i < v.size() && max + v[i] <= w) {
            max += v[i];
            q.push(i);
            arr[i].time = sec, arr[i].w = v[i];
            i++;
        }
    } while (!q.empty());

    return sec;
}

말 그대로 구현을 하면 되지만 구현이 헷갈리는 문제였다.
시간의 흐름을 따라 계산해야 하는 문제이기 때문에 시간을 1초씩 올리면서 다리에 올라간 트럭들의 출입 시간을 기록하고,
지금 시간이 Queue의 맨 앞 트럭이 나갈 시간이라면 가용 하중을 저장하는 max에서 빼주고 pop 해준다.

그리고 다리의 최대 하중이 허용이 된다면 트럭을 출입시키고, 가용 하중에 트럭의 무게를 더해주고 Queue에 넣는다.
트럭이 들어간 시간과 트럭의 무게를 저장해야 하므로 info라는 구조체를 따로 만들어서 저장해주고,
Queue로 트럭의 순서 인덱스를 기록하며 info형 배열인 arr에 저장하는 식으로 풀었다.

트럭이 현재 시간에 다리에서 나갈 시간인지 확인하는 방법은
(맨 앞 트럭이 들어간 시간대 + 다리의 길이 <= 현재 시간) 이 된다.
트럭은 초당 1씩 움직인다고 가정했으므로, 다리에 들어간 후 (다리의 길이)초가 지나면 다리에서 나오게 된다.

그리고 Queue가 비었다면 모든 작업이 마무리 된 것이므로 현재 시간 sec을 return한다.

profile
·ᴗ·

0개의 댓글