[Programmers] 과제 진행하기(Lv.2)

Alice·2023년 5월 13일
0

풀이 소요시간 : 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;
}
profile
거창하지 않아도, 늘 꾸준히 기록하는 습관

0개의 댓글