[프로그래머스 Level2] 기능개발

Wonjun·2022년 7월 31일
0

알고리즘 & 문제풀이

목록 보기
29/50
post-thumbnail

📝 기능개발

문제 설명

기능개발

해결 방법

각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포된다. 어떤 기능이 먼저 완성되었더라도 앞에 있는 모든 기능이 완성되지 않으면 배포가 불가능하다.
선입선출 구조인 queue를 사용한다.
총 진행한 작업의 개수를 확인하기 위해 check 변수를 선언한다.
큐에 기능의 진행도를 순서대로 삽입하고 큐의 front 가 100에 도달하면 pop 한다.
이 때 pop 한 개수를 세서 cnt 한 번에 배포한 작업의 개수를 answer에 push_back 한다.
front 가 100이 넘지 않았다면 큐를 비우고 모든 기능에 speeds를 더해 큐에 재 push 한다.
이 과정을 모든 기능이 100에 도달해서 pop 될 때 까지 반복한다.

💻소스코드

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

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    queue<int> q;
    int check = 0;  // 총 진행한 작업의 개수
    
    while (check < progresses.size()) {
        int cnt = 0;    // 한 번에 배포한 작업의 개수
        
        for (int i = check; i < progresses.size(); i++)   // 선입선출, 큐에 순서대로 삽입
            q.push(progresses[i]);
        if (q.front() >= 100) {
            while (q.front() >= 100 && !q.empty()) {
                q.pop();
                cnt++;
            }
            answer.push_back(cnt);
            check += cnt;
        }
        else {
            while (!q.empty())
                q.pop();
            for (int j = 0; j < progresses.size(); j++)
                progresses[j] += speeds[j];
        }
    }
    return answer;
}
profile
알고리즘

0개의 댓글