Algorithm/Programmers(c++)

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

kim-hasa 2021. 8. 12. 13:12

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

기능이 개발이 완료가 되었다면, 앞에서부터 완료가 된건 한번에 배포합니다.

 

남은 일수를 구한 후, 앞에서부터 일수보다 작다면 이미 완료된 기능이므로 한번에 배포합니다.

그렇지 않은 경우는 배포 후 다음 날짜가 맞출 때 배포합니다.

 

사실 풀고나서 알았는데 queue를 이용해서 완료가 되었을 때 앞에서부터 배포하는 방법으로 했으면 더욱 쉬웠을 것 같습니다. 다른 분들의 풀이를 보고 더 연습해봐야겠습니다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    int len = progresses.size();    // 전체 일의 갯수
    
    vector<int> extraWork;          // 완료까지 남은 일의 수
    
    for(int i=0; i<len; i++)
    {
        int extra = 100 - progresses[i];    // 남은 일의 수
        if(extra % speeds[i] == 0)          // 나누어 떨어진다면
        {
            extra = extra/speeds[i];
            extraWork.push_back(extra);
        }
        else                                // 나누어 떨어지지 않는다면
        {
            extra = extra/speeds[i];
            extraWork.push_back(extra + 1);
        }
    }
    
    int finCount = 1;   
    int finWork = extraWork[0];     // 초기값 저장
    
    for(int j=1; j<len; j++)
    {
        if(extraWork[j] <= finWork)     // 저장값보다 작다면
        {
            finCount++;     // 같이 끝남
        }
        else                            // 크다면
        {
            answer.push_back(finCount);     // 배포 완료
            finWork = extraWork[j];         // 새로 저장
            finCount = 1;                   // 카운트 초기화
        }
    }
    answer.push_back(finCount);         // 마지막 남은 값 저장
    
    return answer;
}