개발/알고리즘

백준-6189 (골드 5) 옥상 정원 꾸미기 STACK

차가운콩 2024. 4. 18. 23:55

해당 문제의 알고리즘 분류를 보면 스택을 사용하여야 한다고 되어있습니다.

 

만약 배열을 써서 계속 반복문을 돌려도 풀 수 있을거 같긴한데 시간초과가 날꺼 같았습니다.

 

해당 문제에 입력이 아래 처럼 나온다면

6
10
3
7
4
12
2

 

처음에 스택은 비어있기 때문에  0을 증감 시키고 10을 스택에 추가합니다.

3은 10보다 작기 때문에 while문을 돌지 않고 스택의 사이즈만큼 증가시키고 3을 스택에 추가합니다.

 

count : 1

 

현재 스택 : [10,3] 

 

다음으로 7이 입력으로 들어옵니다. 7은 3보다 크기 때문에  while문을 돌고 증가 후 스택에 7을 추가합니다.

 

counnt: 2

 

현재 스택 : [10,7]

 

4가 들어옵니다 while문을 돌지 않고 증가시키고 4를 추가합니다.

 

count: 4

 

현재 스택 : [10,7,4]

 

12가 들어옵니다 스택안에 있는 숫자는 12보다 작기 때문에 스택이 empty가  됩니다  그리고 스택에 12를 추가합니다

 

count: 4;

 

현재 스택 : [12]

 

2가 들어옵니다 2는 12보다 작기 때문에 스택의 크기만큼 증가 시키면  카운트가 5가 됩니다.

 

 

여기서 스택의 크기를 더하는 이유는 스택이 10, 7 , 4 일때  4는 7보다도 작고 10보다도 작으니
그 스택의 크기만큼 더해야 합니다. 

 

 

#include <iostream>
#include <stack>


using namespace std;




int main() {
	
	
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	stack<long long> st;
	
	long long count = 0;
	
	long long n,x;
	
	cin >> n;
	
	for(int i = 0; i < n; i++){
		cin >> x;
		
		
		while(!st.empty() && st.top() <= x){
			st.pop();
		}
		
		count += (long long)st.size();
		st.push(x);
	}
	
		
	
	 
	
	cout << count;	
	

	
}