본문 바로가기

algorithm

백준 6198번 옥상 정원 꾸미기 - 모노톤 스택

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

 

https://www.acmicpc.net/problem/17298의 하위호환

 

아이디어:

1. 모노톤 스택 사용

스택에는 2가지 문제 유형이 있는데, 첫번째는 괄호 지우는 것처럼 자연스러운 패턴을 찾는 것

2번째는 6198번과 모노톤 스택처럼 스택 내부의 정렬(?)이다.

https://www.youtube.com/watch?v=Z4R582bn7B8

2. 목표는 빌딩을 볼 수 있는 횟수의 총합

3. 스택의 입력은 빌딩의 높이인데, 이걸 내림차순으로 정렬해서 더 낮은 값이 있으면 pop하는 로직이 필요하다.

4. 첫 빌딩 높이는 그냥 push

5. 다음 들어오는 빌딩부터

만약, 스택 top이 입력 빌딩보다 작으면 pop하고 크거나 같으면 정답에 더한 뒤, 스택에 push한다.

(ex. 백준 예제의 경우, 10, 3, 7, 4 12, 2에서

10 입력 > 스택: [10]

3 입력 > 스택: [10]로 answer 1 추가, 3 push

7 입력 > 스택: [10, 3]에서 7은 3보다 크므로 3 pop, 10보다 작으므로 answer 1 추가, 7 push

4 입력 > 스택: [10, 7]로 answer 2 추가, 4 push

12 입력 > 스택: [10, 7, 4]에서 12보다 작은 숫자 pop, 12 push

2 입력 > 스택: [12]로 answer 1 추가, 2 push)

 

// 6198

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, h;
	long long answer = 0;
	cin >> N;
	vector<int> building(N, 0);
	stack<int> myStack;

	for (int i = 0; i < N; i++) {
		
		cin >> h;

		if (myStack.empty()) {
			myStack.push(h);
			continue;
		}

		while (!myStack.empty() && myStack.top() <= h) {
			myStack.pop();
		}
		answer += myStack.size();
		myStack.push(h);

	}

	cout << answer;

	return 0;
}

'algorithm' 카테고리의 다른 글

백준 17298번 오큰수 - 스택  (0) 2024.12.29
백준 1874번 스택 수열  (0) 2024.12.15
백준 11003번 최솟값 찾기 - 덱 정렬  (0) 2024.12.15
백준 12891번 DNA 비밀번호  (0) 2024.12.15
백준 1253번 좋다  (0) 2024.12.02