[프로그래머스]
프로그래머스 과제 진행하기 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;
}
반응형