프로그래머스/2레벨
[프로그래머스/C++] 과제 진행하기
Koalitsiya
2024. 3. 12. 16:42
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 멈춰둔 과제가 여러 개일 경우, 가장 최근에 멈춘 과제부터 시작 > 여기서 스택을 떠올림
- 스택에 시작되는 과제 명과 해당 과제를 해결하는데 소요되는 시간을 저장하여 가장 최근에 삽입된 과제의 시간을 감소시켜가며 0이 되는 경우에 pop_back 해주면 됨
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 비교자
bool cmp(vector<string> a, vector<string> b) {
return a[1] < b[1];
}
vector<string> solution(vector<vector<string>> plans) {
vector<string> answer;
vector<pair<string, int>> taskStack;
// 과제의 시작 시간 기준으로 정렬
sort(plans.begin(), plans.end(), cmp);
int curTime = 0;
for(int i = 0; i < plans.size(); i++) {
// 시작 시간을 분단위 int형 데이터로 만듦
int nextTime = 60 * stoi(plans[i][1].substr(0, 2)) + stoi(plans[i][1].substr(3, 5));
// 현재 시간이 과제 시작 시간보다 작을 때
while(curTime < nextTime) {
// 과제 스택의 사이즈가 0보다 크면
if(taskStack.size() > 0) {
// 가장 최근의 과제를 진행
taskStack.back().second--;
// 가장 최근의 과제가 끝나면
if(taskStack.back().second == 0)
{
// 끝낸 과제에 삽입하고
answer.push_back(taskStack.back().first);
// 과제 스택에서 제거
taskStack.pop_back();
}
}
// 현재 시간을 1씩 증가
curTime++;
}
// 현재 시간이 과제 시작 시간이 되었으므로
taskStack.push_back({plans[i][0], stoi(plans[i][2])});
}
// 과제 스택이 비어있지 않으면 안에 있는 과제를 최신 순서대로 answer에 삽입
while(taskStack.size() > 0) {
answer.push_back(taskStack.back().first);
taskStack.pop_back();
}
return answer;
}