최대 1 분 소요

Question

Q


Solution

  • 핵심 포인트는 가장 앞의 작업 진도가 100이 될 때까지 뒤에 있는 작업들은 100이 된 상태에서 대기 한다는 점이다.
  • 따라서 queue에 idx값들을 size만큼 넣어준다.
  • q.front의 진도 100이 되는데 걸리는 시간은 (100 - 현재 진도) / 속도 가된다. (나머지가 나온다면 +1 추가)
  • 가장 앞에 있는 작업의 걸린 시간 만큼 뒤에 있는 작업들의 진행도를 업데이트 시켜준다.
  • q.front의 진도가 100이면 q.pop 해준다.

Cord

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

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds)
{
    vector<int> answer;
    queue<int> q;

    // q에 progresses.size 만큼 인덱스 순서대로 넣기
    for (int i = 0; i < progresses.size(); i++) { q.push(i); }

    while (!q.empty())
    {
        int idx = q.front();
        int cnt = 0; // 완료 수 (q에서 빼낸 수)

        // 진도가 100이 될때까지 걸리는 시간
        int spentTime = (100 - progresses[idx]) / speeds[idx];
        if ((100 - progresses[idx]) % speeds[idx] != 0) { ++spentTime; }

        for (int i = idx; i < progresses.size(); ++i)
        {
            // 진도가 100이 아니면 걸린 시간 만큼 더하기 
            if (progresses[i] < 100) { progresses[i] += spentTime * speeds[i]; }

            // 가장 앞에있는 작엎의 진도가 100이라면 q에서 빼내기
            if (progresses[i] >= 100 && idx == i)
            {
                q.pop();
                ++idx;
                ++cnt;
            }
        }

        answer.push_back(cnt);
    }

    return answer;
}

Result

Result