입력으로
가 배열(또는 벡터)로 주어진다. 매일 progresses의 원소들은 speeds의 원소만큼 (1대 1 대응으로) 작업이 진행되는데 작업이 완료되면 배포가 된다. 다만 조건은 각각의 인덱스의 앞 인덱스의 작업이 완료되지 않으면 대기해야 한다는 것이다.
작업이 완료되는 날마다 그 횟수를 저장했다가 모든 작업이 완료되는 순간에 그 횟수를 리턴하는게 문제의 정답이다.
나는 이 문제를 일수를 기준으로 슬라이딩 하면서 풀이를 하였다. 더 효율적인 방법이 있겠지만 공간 사이즈가 크지 않아서 그렇게 풀어도 상관이 없다. 즉 작업이 완료될 수 있는 일인 1일부터 101일(예외 케이스가 생길 수 있기 때문에 101로 설정. 의미상 100일로 이해하면 된다.) 까지 for문을 순회하면서 작업이 완료됨을 체크해서 vector에 push_back하였다. 1일부터 101일까지 모두 순회 후 vector의 값을 리턴을 하면 정답이 된다.
#include <string>
#include <vector>
using namespace std;
bool isCompleted[101];
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
for (int i = 1; i <= 101; i++) // 일 수 별로 슬라이딩
{
for (int j = 0; j < progresses.size(); j++) // 진도 업데이트
{
if (progresses[j] >= 100)
continue;
progresses[j] += speeds[j];
}
int ansElement = 0;
for (int j = 0; j < progresses.size(); j++)
{
if (progresses[j] < 100)
break;
if (isCompleted[j])
continue;
isCompleted[j] = true;
ansElement++;
}
if (ansElement > 0)
answer.push_back(ansElement);
}
return answer;
}
이 문제는 큰 틀로는 구현(implementation)으로 잡았지만 스택/큐 문제로 프로그래머스에 분류되어있다. 해당 문제는
이므로 무조건 맞춰야 함을 알 수 있다. 이번 problem-solving 프로젝트로 실력을 계속 향상시켜야 되겠다.