프로그래머스/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;
}