본문 바로가기

c++/Baekjoon Online

백준 6198 : 옥상 정원 c++ (monotone stack)

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

 

6198번: 옥상 정원 꾸미기

문제 도시에는 N개의 빌딩이 있다. 빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다. i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으

www.acmicpc.net

 

 

monotone stack이란?

-> 스택 내부를 오름차순 또는 내림차순으로 유지 해주는 알고리즘

https://justicehui.github.io/medium-algorithm/2019/01/01/monotoneStack/

 

monotone stack

monotone stack은 몇몇 문제들의 시간 복잡도를 O(n)정도로 줄어주는 강력한 테크닉입니다.

justicehui.github.io

풀이

1. 총합을 구하는 것이기 때문에 한 건물 한건물을 추가할때마다 stack 에 자기보다 큰놈들만 냅두기

-> 여기서 monotone  stack 사용

 

2. 자기보다 큰놈들 = 자기를 바라볼 수 있는 애들

 -> 매번 남은 stack의 사이즈를 정답에 더해주면 된다.

 

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

long long answer = 0;
int input;
stack<int> s;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;

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

		while (!s.empty())
		{
			if (s.top() > input)
				break;

			s.pop();
		}

		answer += (long long)s.size();
		s.push(input);
	}


	cout << answer << endl;
	return 0;
}

 

'c++ > Baekjoon Online' 카테고리의 다른 글

백준 1765 : 닭싸움 팀 정하기 C++  (0) 2021.09.12
백준 11967 : 불켜기 C++  (0) 2021.09.12
백준 2258 : 정육점 c++  (0) 2021.07.01
백준 1461 : 도서관 C++  (0) 2021.06.27
백준 8980 : 택배 C++  (0) 2021.06.27