프로그래밍/C++

프로그래머스_코딩테스트연습_스택/큐_기능개발

donie 2020. 9. 1. 18:04

♠ 소스코드

#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <iterator>
using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {

    vector<int> answer;

    int size = progresses.size();
    //cout <<size <<endl; // for debug
    queue<int> my_progresses;

     for(int i=0; i<size; i++)
    {
        int progress_left = 100 - progresses[i];
        int days_left = progress_left / speeds[i]; 
        if( progress_left % speeds[i] ) days_left ++;

          my_progresses.push( days_left );

    }
    
    // 첫 배포
    int done = my_progresses.front();
    my_progresses.pop(); //배포 실행

    int cnt = 1;

     if(my_progresses.empty()) { answer.push_back(cnt); }
    // 배포 진행
    while( !my_progresses.empty() )
    {
        if( my_progresses.front() > done )

          {

                answer.push_back(cnt);

                cnt = 1;

                done = my_progresses.front();

          }

         else { cnt++; }
        //cout << "done " << done << "   cnt " << cnt << endl; //for debug
        my_progresses.pop(); //배포 실행
        if(my_progresses.empty())  { answer.push_back(cnt); }
    }
    return answer;
}

 

고찰

▶ 문제 이해

가장 앞에 있는 작업 진도가 100%일 때 / 뒤에 이미 진행이 완료된 작업이 있다면 함께 배포되는 문제이다.

함께 배포될 때, 작업들은 연속되어야 하고, 그 사이에 진행이 완료되지 않은 작업이 있다면 함께 배포될 수 없다.

ex. progesses = [1  2  1], speeds = [1 1 1]일 때 answer = [1 2]가 된다.

 

 알고리즘은,

1) 각 작업의 남은 일수를 계산하여 큐 my_progresses에 넣고,

2) 첫 배포 실행

 - done변수에 현재 배포까지 작업일수를 저장한다.

3) while문 : loop를 한 번 돌 때 한 작업씩 배포한다.

 - 만약 my_progresses의 front의 값(남은 일수)이 현재까지 작업일수보다 크다면 새로 배포해야 한다. 따라서 cnt를 answer에 넣고, cnt는 1로 초기화, done도 현재 작업일수로 set한다.

 - 만약 my_progresses의 front의 값(남은 일수)이 현재까지 작업일수보다 작다면 이전 배포와 함께 배포될 수 있다. 따라서 cnt +1한다.

 

실수한 부분

처음 코드를 작성했을 때 하나의 테스트케이스(#11)를 실패했었다.

첫 코드에서는 남은 일수를 계산할 때 cmath의 ceil()함수를 사용했었다.

다른 사람의 후기를 보니 math의 ceil()함수때문이라고 하여 이 부분을 수정하였다.

ceil()함수 리턴값이 double형이라고 해서 int형 변수 선언해서 값을 받아 넣기도 하고(자동형변환), 강제형변환을 통해 넣어보기도 했는데, 계속 실패한다. 

아직은 그 이유를 모르겠다.