관리 메뉴

fatalite

C++ / 과제 진행하기 본문

코딩 인터뷰/프로그래머스

C++ / 과제 진행하기

fataliteforu 2023. 4. 19. 21:16

Problem

문제 난이도 : 프로그래머스 2단계

분류 : 스택, 정렬, 구현

이거 쉬운 문제인것 같은데 못풀어서 자괴감이 심했다...


Solution

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <iostream>
#include <stack>
using namespace std;


int PlanToTime(vector<string> vs1){
    string a = vs1[1];
    int first = atoi(a.substr(0, 2).c_str()) * 60 
        + atoi(a.substr(3, 2).c_str()) ;
    return first;
};

bool cmp(vector<string> vs1, vector<string> vs2){
    int a = PlanToTime(vs1);
    int b = PlanToTime(vs2);
    return a > b;
}

vector<string> solution(vector<vector<string>> plans) {
    vector<string> answer;
    sort(plans.begin(),plans.end(),cmp);
    //Plan Stack과 Plan Queue;
    vector<vector<string>> StackPlan;
    vector<vector<string>> WaitingPlan;
    for(vector<string> v: plans){
        StackPlan.push_back(v);
    }
    while(!StackPlan.empty()){
        vector<string> Current = StackPlan.back();
        StackPlan.pop_back();
        if(StackPlan.empty()){
            answer.push_back(Current[0]);
            break;
        }
        vector<string> Next = StackPlan.back();
        
        int CurrentTime = PlanToTime(Current);
        int NextTime = PlanToTime(Next);
        int CurrentPlanDuration = atoi(Current[2].c_str());
        int LeftTime = NextTime - (CurrentTime + CurrentPlanDuration);
        
        
        if(LeftTime < 0){
            int DoneDuration =  atoi(Current[2].c_str()) - (NextTime - CurrentTime);
            Current[2] = to_string(DoneDuration);
            WaitingPlan.push_back(Current);
        }else{
            answer.push_back(Current[0]);
            while(!WaitingPlan.empty()){
                vector<string> CurrentQueue = WaitingPlan.back();
                WaitingPlan.pop_back();
                int CurrentQueueDuration = atoi(CurrentQueue[2].c_str());
                if(LeftTime >= CurrentQueueDuration){
                    LeftTime -= CurrentQueueDuration;
                    answer.push_back(CurrentQueue[0]);
                }else{
                    CurrentQueue[2] = to_string(atoi(CurrentQueue[2].c_str()) - LeftTime);
                    WaitingPlan.push_back(CurrentQueue);
                    break;
                }
            }
        }
        
    }
    
    while(!WaitingPlan.empty()){
        answer.push_back(WaitingPlan.back()[0]);
        WaitingPlan.pop_back();
    }
        
    return answer;
}

'코딩 인터뷰 > 프로그래머스' 카테고리의 다른 글

C++ / 영어 끝말잇기  (0) 2023.05.07
C++ / 숫자의 표현  (0) 2023.04.24
C++ / 이진 변환 반복하기  (0) 2023.04.24
C++ / 올바른 괄호  (0) 2023.04.22
C++ / 최소값 만들기  (0) 2023.04.22