문제 푼 날짜 : 2021-10-06
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42586
스택을 이용하여 쉽게 풀 수 있는 문제였다.
아래의 생각대로 코드를 구현해주었다.
- 각 작업별로 완성까지 걸리는 날을 구해준다.
- 처음 스택에 들어간 작업보다 완성까지 걸리는 날이 작거나 같으면 push해준다.
- 그렇지 않은 작업이 들어올 경우, 스택에 들어있는 것들이 한 번에 배포되는 작업을 뜻하므로 그 상태의 스택의 크기를 저장해준다.
- 다음 작업부터 다시 스택에 넣어주어 2.부터 반복한다.
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
#include <stack>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
int totalWork = progresses.size();
vector<int> days;
for (int i = 0; i < totalWork; i++) {
days.push_back(ceil((float) (100 - progresses[i])/speeds[i]));
}
stack<int> st;
int first;
for (int d : days) {
if (st.empty()) {
first = d;
st.push(d);
} else {
if (first >= d) {
st.push(d);
} else {
answer.push_back(st.size());
while (!st.empty()) {
st.pop();
}
first = d;
st.push(d);
}
}
}
answer.push_back(st.size());
return answer;
}
스택을 이용한 문제도 어려우면 생각하기 쉽지 않은 것 같다. 더 많은 문제를 풀어봐야겠다.