백준 17592 c++

magicdrill·2024년 6월 6일

백준 문제풀이

목록 보기
363/673

백준 17592 c++

다른 풀이들에 비해 시간은 짧지만 메모리가 수배는 더 먹었다. 컨테이너와 변수를 많이 써서 그런거 같다. 근데 이 난이도에 있을 문제가 아닌거 같다.
입력과 풀이를 독립시켜서 풀어보려고 했는데 그건 다른 문제로 다시 도전해 보겠다. 메모리 사용량도 줄여보겠다.

#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;
}

0개의 댓글