728x90
반응형
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/176962
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
반응형
728x90
👩💻 코드
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
#include <iostream>
using namespace std;
struct Task{
string name;
int start;
int duration;
};
int timeToint(string time){
int hours = stoi(time.substr(0, 2));
int minutes = stoi(time.substr(3, 2));
return hours * 60 + minutes;
}
vector<string> solution(vector<vector<string>> plans) {
vector<string> answer;
vector<Task> tasks;
stack<Task> pausedTasks;
for(auto& plan : plans) {
string name = plan[0];
int start = timeToint(plan[1]);
int duration = stoi(plan[2]);
tasks.push_back({name, start, duration});
}
sort(tasks.begin(), tasks.end(), [](const Task& a, const Task& b) {
return a.start < b.start;
});
int currentTime = 0;
for (size_t i = 0; i < tasks.size(); i++) {
Task currentTask = tasks[i];
currentTime = currentTask.start;
int endTime = currentTime + currentTask.duration;
if (i < tasks.size() - 1 && tasks[i + 1].start < endTime) {
currentTask.duration -= (tasks[i + 1].start - currentTime);
pausedTasks.push(currentTask);
} else {
answer.push_back(currentTask.name);
currentTime = endTime;
while (!pausedTasks.empty()) {
Task pausedTask = pausedTasks.top();
pausedTasks.pop();
endTime = currentTime + pausedTask.duration;
if (i < tasks.size() - 1 && tasks[i + 1].start < endTime) {
pausedTask.duration -= (tasks[i + 1].start - currentTime);
pausedTasks.push(pausedTask);
break;
} else {
answer.push_back(pausedTask.name);
currentTime = endTime;
}
}
}
}
while(!pausedTasks.empty()){
answer.push_back(pausedTasks.top().name);
pausedTasks.pop();
}
return answer;
}
📝 풀이
plans의 정보를 Task 구조체로 변환한 후 시작 시간을 기준으로 정렬합니다.
과제를 시작하고 다음 과제의 시작 시간이 현재 과제가 끝나는 시간보다 이른지 확인합니다.
이르다면 현재 과제를 멈추고, 남은 시간을 업데이트 한 뒤 스택에 저장합니다.
이르지 않다면 현재 과제를 완료하고 답안에 추가합니다.
그리고 멈춰둔 과제가 있다면 최근에 멈춘 과제부터 이어서 처리합니다.
이 때 다음 과제의 시작 시간을 넘지 않도록 주의하며 처리합니다.
반복문이 종료된 후에도 멈춘 과제가 남아 있다면 마지막으로 처리합니다.
최종적으로 과제를 끝낸 순서 answer을 return 합니다.
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] N-Queen (0) | 2024.10.21 |
---|---|
[프로그래머스] 두 원 사이의 정수 쌍 (0) | 2024.10.18 |
[프로그래머스] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 (1) | 2024.10.17 |
[프로그래머스] 후보키 (0) | 2024.10.17 |
[프로그래머스] 점 찍기 (0) | 2024.10.14 |