[프로그래머스 C++] 과제 진행하기
[프로그래머스 C++] 과제 진행하기
https://school.programmers.co.kr/learn/courses/30/lessons/176962
해결전략
문자열
자료구조 스택 stack
정답코드
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
struct Info { // 과제 정보를 담는 구조체 정의
string subject; int time, duration;
Info(string a, int b, int c) {
subject = a;
time = b;
duration = c;
}
bool operator<(const Info& oper) const{
return time < oper.time; // 시작 시간을 기준으로 오름차순 정렬
}
};
vector<string> solution(vector<vector<string>> plans) {
int n = plans.size(); // 전체 과제의 수
vector<string> answer; // 최종 과제 수행 순서를 담을 벡터
vector<Info> v; // 과제 정보를 담을 벡터
stack<Info> st; // 시간 내에 끝내지 못한 과제를 임시 저장할 스택
for (int i = 0; i < n; i++) // 문자열로 주어진 과제 정보를 파싱하여 벡터에 저장
{
string subject = plans[i][0];
string time = plans[i][1];
string duration = plans[i][2];
int t = stoi(time.substr(0, 2)) * 60 + stoi(time.substr(3, 5)); // 분 단위
int dur = stoi(plans[i][2]);
v.push_back({ subject, t, dur });
}
sort(v.begin(), v.end()); // 시작 시간 기준으로 과제 정렬
for (int i = 1; i < n; i++)
{
if (v[i - 1].time + v[i - 1].duration <= v[i].time) // 이전 과제와 현재 과제 사이에 시간적 여유가 있는 경우
{
answer.push_back(v[i - 1].subject);
int leftTime = v[i].time - (v[i - 1].time + v[i - 1].duration);
while (leftTime && !st.empty()) // 스택에 남아있는 과제를 시간적 여유를 바탕으로 처리
{
if (leftTime >= st.top().duration) {
leftTime -= st.top().duration;
answer.push_back(st.top().subject);
st.pop();
}
else { // leftTime < Q.front().duration
st.top().duration -= leftTime;
leftTime = 0;
}
}
}
else // 시간적 여유가 없는 경우, 과제를 스택에 저장
{
v[i - 1].duration -= (v[i].time - v[i - 1].time);
st.push({ v[i - 1].subject, v[i - 1].time, v[i - 1].duration });
}
if (i == n - 1) { // 맨 마지막 과제 소요 시간과 상관없이 끝낸다
answer.push_back(v[i].subject);
}
}
while (!st.empty()) // 아직 끝내지 못한 과제를 순차적으로 끝냄
{
answer.push_back(st.top().subject);
st.pop();
}
return answer;
}
int main() {
vector<vector<string>> testcase1 = { {"korean", "11:40", "30"}, {"english", "12:10", "20"},{"math", "12:30", "40" } };
vector<vector<string>> testcase2 = { {"science", "12:40", "50"}, {"music", "12:20", "40"}, {"history", "14:00", "30"}, {"computer", "12:30", "100"} };
vector<vector<string>> testcase3 = { {"aaa", "12:00", "20"}, {"bbb", "12:10", "30"}, {"ccc", "12:40", "10"} };
vector<vector<string>> testcase4 = { {"aaa", "12:00", "30"}, {"bbb", "12:10", "30"}, {"ccc", "14:00", "30"} };
solution(testcase1); // "korean", "english", "math"
solution(testcase2); // "science", "history", "computer", "music"
solution(testcase3); // "bbb", "ccc", "aaa"
solution(testcase4); // "bbb", "aaa", "ccc"
return 0;
}
'⭐ 코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 C++] 이모티콘 할인행사 (0) | 2024.03.18 |
---|---|
[프로그래머스 C++] 두 원 사이의 정수 쌍 (0) | 2024.03.17 |
[프로그래머스 C++] 혼자 놀기의 달인 (0) | 2024.03.11 |
[프로그래머스 C++] 우박수열 정적분 (0) | 2024.03.06 |
[프로그래머스 C++] 광물 캐기 (0) | 2024.03.04 |
댓글
이 글 공유하기
다른 글
-
[프로그래머스 C++] 이모티콘 할인행사
[프로그래머스 C++] 이모티콘 할인행사
2024.03.18 -
[프로그래머스 C++] 두 원 사이의 정수 쌍
[프로그래머스 C++] 두 원 사이의 정수 쌍
2024.03.17 -
[프로그래머스 C++] 혼자 놀기의 달인
[프로그래머스 C++] 혼자 놀기의 달인
2024.03.11 -
[프로그래머스 C++] 우박수열 정적분
[프로그래머스 C++] 우박수열 정적분
2024.03.06