카테고리 없음
[C++] 프로그래머스 과제 진행하기
이영재의오른발
2023. 4. 1. 14:48
반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <string> #include <vector> #include <queue> #include <algorithm> #include <iostream> #include <deque> using namespace std; bool cmp(vector<string> a, vector<string> b) { return a[1] < b[1]; } int timediff(string a, string b) { string first_hour = ""; first_hour = first_hour + a[0] + a[1]; int first = stoi(first_hour) * 60; string first_minute = ""; first_minute = first_minute + a[3] + a[4]; first += stoi(first_minute); string second_hour = ""; second_hour = second_hour + b[0] + b[1]; int second = stoi(second_hour) * 60; string second_minute = ""; second_minute = second_minute + b[3] + b[4]; second += stoi(second_minute); return second - first; } vector<string> solution(vector<vector<string>> plans) { vector<string> answer; deque<pair<string,int>> undone; sort(plans.begin(),plans.end(),cmp); for(int i=0; i<plans.size()-1; i++) { int minus = timediff(plans[i][1],plans[i+1][1]); if(minus >= stoi(plans[i][2])) { answer.push_back(plans[i][0]); int time_tmp = minus - stoi(plans[i][2]); while(!undone.empty()) { int rest_time = undone[0].second; if(rest_time <= time_tmp) { answer.push_back(undone[0].first); undone.pop_front(); time_tmp -= rest_time; } else { undone[0].second -= time_tmp; break; } } } else { int tmp = stoi(plans[i][2]) - minus; undone.push_front({plans[i][0], tmp}); } } answer.push_back(plans[plans.size()-1][0]); while(!undone.empty()) { answer.push_back(undone[0].first); undone.pop_front(); } return answer; } | cs |
1. 시간 순으로 정렬
2. 정렬된 상태에서 현재 과제의 시작시간과 다음 과제의 시작 시간을 비교
3. 비교 시간이 현재 과제의 진행 시간보다 짧을 경우
{ 과제이름, 현재 과제의 진행시간 - 비교시간 } 을 덱에 저장
4. 비교 시간이 현재 과제의 진행 시간보다 길 경우
4-1. 현재 과제명을 answer 벡터에 저장
4-2. 덱에 저장된 첫번째 인덱스부터 과제 진행
5. 덱에 남은 과제를 첫번째 인덱스 순서대로 answer 벡터에 넣어줌
728x90
반응형