풀이 소요시간 : 60분 초과(실패)
Stack
을 사용하는 문제를 거의 처음 본지라 딱봐도 Stack
을 써야되는데 인지하는데 시간이 좀 걸렸다. 뭔가 찝찝한 점은, 다 풀고 남들이랑 코드를 비교해보니 내가 유독 풀이방식을 다르게 구현했다. 왠만하면 남들의 정석풀이를 참고하겠지만 사실 내 코드가 좀더 깔끔하게 구현된 것 같아서 이번에는 넘어가도록 하겠다.
#include <string>
#include <stack>
#include <algorithm>
#include <vector>
using namespace std;
struct Homework {
string Name;
int Hour;
int Min;
int Left_Time;
};
vector<Homework> Vector;
stack<Homework> Stack;
//빨리 시작하는 순서대로
bool Cmd(Homework A, Homework B) {
if(A.Hour == B.Hour) {
return A.Min < B.Min;
} else {
return A.Hour < B.Hour;
}
}
vector<string> solution(vector<vector<string>> plans) {
for(int i = 0; i < plans.size(); i++) {
string Name = plans[i][0];
int Hour = stoi(plans[i][1].substr(0, 2));
int Min = stoi(plans[i][1].substr(3));
int Left_Time = stoi(plans[i][2]);
Vector.push_back({Name, Hour, Min, Left_Time});
}
sort(Vector.begin(), Vector.end(), Cmd);
// Homework 로 추출 후 정렬 완료.
vector<string> answer;
for(int i = 0; i < 24; i++) {
for(int j = 0; j < 60; j++) {
//종료된 과제 컷
if(Stack.size() > 0) {
if(Stack.top().Left_Time > 0) {
Stack.top().Left_Time--;
if(Stack.top().Left_Time == 0) {
answer.push_back(Stack.top().Name);
Stack.pop();
}
}
}
//시작 시간이 되면 Stack 에 Push
if(Vector[0].Hour == i && Vector[0].Min == j && Vector.size() > 0) {
Stack.push(Vector[0]);
Vector.erase(Vector.begin());
}
//과제가 00:00 에 투입, 00:01 이 되면 1 만큼 수행한다.
// 00 : 30 이 되면 30만큼 수행한다.
// 완료 즉시 pop 한다.
}
}
while(!Stack.empty()) {
answer.push_back(Stack.top().Name);
Stack.pop();
}
return answer;
}