본문 바로가기

알고리즘/Programmers

Programmers / Stack, Queue / 기능개발

< 문제링크 >

https://www.welcomekakao.com/learn/courses/30/lessons/42586

< 풀이 >

1. 남은 시간을 계산하여 배열로 만든다.

2. 현재 인덱스를 기준으로 현재 남은 시간이하인 연속된 항목들은 한 묶음으로 볼 수 있다.

ex) 남은 시간이 [7, 3, 6, 2, 9, 5] 인 경우, 0번 인덱스를 기준으로 {7, 3, 6, 2}이 한묶음이 된다.

3. 한 묶음을 구성하였을 때, 그 항목의 수가 답이 되므로 answer에 추가한다.

ex) 위의 예시의 경우 4를 추가한다.

4. 한 묶음이 구성된 이후 인덱스가 다음 기준 인덱스가 된다.

ex) 위의 예시의 경우 4가 다음 인덱스이다.

5. 모든 항목을 다 처리할 때 까지 묶음을 계속해서 만들고 처리한다.

-> 이 때, 항목이 끝났으나 묶음처리가 끝나지 않을 수 있으므로 마지막 항목처리 후에는 묶음처리를 해주어야 한다.

< 코드 >

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    vector<int> rest;
    // 남은 시간 배열 형성
    for (int i = 0; i < speeds.size(); i++) {
        rest.push_back(ceil((100 - progresses[i]) / (double)speeds[i]));
    }
    // 기준 남은 시간보다 더 많은 남은 시간이 나올 때 까지 카운트 증가
    int start = rest[0], count = 0;
    for (int i = 0; i < rest.size(); i++) {
        // 기준 남은시간보다 더 남은시간이 큰 값이 나오면 묶음 처리
        if (start < rest[i]) {
            answer.push_back(count);
            count = 0;
            start = rest[i];
        }
        count++;
        // 모든 항목에 대해 처리가 완료된 경우
        if (i == rest.size() - 1) {
            answer.push_back(count);
        }
    }
    return answer;
}

int main(void)
{
    vector<int> progresses = { 93, 30, 55 };
    vector<int> speeds = { 1,30,5 };
    vector<int> answer = solution(progresses, speeds);
    for (vector<int>::iterator iter = answer.begin(); iter != answer.end(); iter++) {
        cout << *iter << " ";
    }
}