[프로그래머스]

프로그래머스 과제 진행하기 C++

Hevton 2023. 8. 30. 22:41
반응형

다른 사람의 풀이를 보니 비슷했다. 단 나는 문자열을 자르는데 stringstream을 사용했다는점!

 

원리는, 시간순으로 오름차순으로 먼저 plans를 정렬한 다음에,

첫번째 원소를 stack에 넣고 시작한다.

 

여기서 주의해야 할 점은, 바로 while문이다.

while문의 조건을 설정하는데 문제가 있어서 자꾸 틀렸다.

 

절대 24시간(MAX 시간) + 100분 (MAX 일 시간) 이 조건의 끝이 아니다.

밀린 일들이 생길 수 있기 때문이다.

 

탈출 조건은, answer이 plans의 크기와 같아질 때로 설정하면 된다.

#include <string>
#include <vector>
#include <stack>
#include <algorithm>
#include <sstream>

using namespace std;

int cmp(vector<string>&a, vector<string>& b) {
    return a[1] < b[1];
}


vector<string> solution(vector<vector<string>> plans) {
    vector<string> answer;
    stack<pair<string, int>> stk;
    int hour, min;
    char x;
    int size = plans.size();
    
    
    sort(plans.begin(), plans.end(), cmp);
    
    
    // 처음부터 stack에 넣고 시작하면 되겠다.
    stk.push({plans[0][0], stoi(plans[0][2])});
    
    stringstream ss(plans[0][1]);
    ss >> hour >> x >> min;
    
    int start = min + (hour * 60);
    int iterator = 1;
    
    // 이 시간 제한이 제일 중요했다. 24시간 + 100분이 MAX가 아니야.
    while(answer.size() != size) {
        
        start += 1;

        if(!stk.empty()) {
            pair<string, int>& top = stk.top(); // & 를 붙여야 참조가 되어서 아래 second를 진행해도 원본에 값 영향이 있다. 실험해보기.

            top.second -= 1;

            if(top.second <= 0) {
                answer.push_back(top.first);
                stk.pop();
            }
        }
        
        if(iterator < size) {
            stringstream sx(plans[iterator][1]);
            sx >> hour >> x >> min;
            if(start == ((hour * 60) + min)) {
                stk.push({plans[iterator][0], stoi(plans[iterator][2])});
                iterator++;
            }
        }
        
    }
    
    return answer;
}
반응형