다른 풀이들에 비해 시간은 짧지만 메모리가 수배는 더 먹었다. 컨테이너와 변수를 많이 써서 그런거 같다. 근데 이 난이도에 있을 문제가 아닌거 같다.
입력과 풀이를 독립시켜서 풀어보려고 했는데 그건 다른 문제로 다시 도전해 보겠다. 메모리 사용량도 줄여보겠다.
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
void find_answer()
{
//입력과 계산을 동시에 해야할듯
//입력과 계산을 따로 하는건 나중에 다시
int answer = 0;
int i;
int N, type;
stack<vector<int>> homework;
int A, T, elapsed_time;
vector <int> current_homework;
cin >> N;
for (i = 0; i < N; i++)
{
cin >> type;
if (type == 1)//새로운 숙제가 발생
{
if (!current_homework.empty())//기존에 하던 숙제가 있다면?
{
homework.push(current_homework);// 기존 숙제를 스택에 집어넣음
current_homework.clear();
}
//새로운 숙제에 대해 입력받음
cin >> A >> T;
elapsed_time = 0;
if (elapsed_time + 1 == T)//이번 분이 끝나면 숙제가 완료된다면?
{
answer += A;
}
else//이번 분이 끝나도 숙제가 완료되지 않는다면?
{
current_homework.push_back(A);//A
current_homework.push_back(T);//T
current_homework.push_back(elapsed_time + 1);//elapsed_time;
}
}
else//새로운 숙제가 발생하지 않음
{
if (current_homework.empty())//현재 진행중인 숙제가 없다면?
{
if (!homework.empty())//대기중인 숙제가 있다면?
{
//스택 가장 위에 있는 숙제를 꺼내서 현재 숙제로 지정함
if (homework.top()[2] + 1 == homework.top()[1])//이번 분이 끝나면 숙제를 완료한다면?
{
answer += homework.top()[0];//대기중인 숙제 점수 더하기
homework.pop();//대기열에서 제거
}
else//이번 분이 끝나도 숙제가 완료되지 않는다면?
{
//스택 가장 위에 있는 숙제를 꺼내서 현재 숙제로 지정함
current_homework.push_back(homework.top()[0]);
current_homework.push_back(homework.top()[1]);
current_homework.push_back(homework.top()[2] + 1);
homework.pop();//대기열에서 제거
}
}
else//대기중인 숙제가 없다면?
{
continue;//그냥 보냄
}
}
else//현재 진행중인 숙제가 있다면?
{
elapsed_time = current_homework[2];
if (elapsed_time + 1 == current_homework[1])//이번 분이 끝나면 숙제를 완료한다면?
{
answer += current_homework[0];//완료한 숙제의 점수 더하기
current_homework.clear();//현재 진행중인 숙제 없앰
}
else//이번 분이 끝나도 숙제가 완료되지 않는다면?
{
current_homework[2]++;//경과 시간 증가
}
}
}
}
cout << answer << "\n";
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
find_answer();
return 0;
}