[백준/BOJ] 백준 2493번 : 탑

2020. 8. 25. 02:04알고리즘 문제풀이

https://www.acmicpc.net/problem/2493

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 ��

www.acmicpc.net

스택을 이용하여 문제를 해결했다. 

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int n;
	int input;
	stack<pair<int, int>> s;
	vector<int> result;

	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		cin >> input;

		//스택에 아무것도 없을때(처음 시작일때)
		if (s.empty())
		{
			result.push_back(0);
			
			//탑의 높이와 번호를 스택에 저장
			s.push(make_pair(input, i));
		}

		//스택 top의 높이가 input 보다 클때
		else if (s.top().first > input)
		{
			result.push_back(s.top().second);
			
			//탑의 높이와 번호를 스택에 저장
			s.push(make_pair(input, i));
		}

		//스택 top의 높이가 input보다 작을때
		else if (s.top().first < input)
		{
			//input보다 높은 탑을 찾을때 까지 스택pop
			while (!s.empty() && s.top().first < input)
			{
				s.pop();
			}

			//input보다 높은 탑이 없었을때
			if (s.empty())
				result.push_back(0);

			//input보다 높은 탑을 찾았을때
			else
				result.push_back(s.top().second);
			
			//탑의 높이와 번호를 스택에 저장
			s.push(make_pair(input, i));
		}
	}

	for (int i = 0; i < result.size(); i++)
		cout << result[i] << " ";

	return 0;
}