
문제 설명
https://www.acmicpc.net/problem/6198
6198번: 옥상 정원 꾸미기
문제 도시에는 N개의 빌딩이 있다. 빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다. i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으
www.acmicpc.net
n개의 빌딩이 있고, 오른쪽의 빌딩만 볼 수 있다
자신이 위치한 빌딩보다 높거나 같은 빌딩이 있을 때, 그 다음에 있는 모든 빌딩의 옥상을 보지 못할 때, 관리인들이 옥상 정원을 확인 할 수 있는 수 구하기
문제 풀이법
문제에서 주어지는 문제 풀이 방법를 통해 문제를 풀려면, 풀리지 않는다
Monotone stack을 사용해야 한다
Monotone stack이란?
- 스택의 원소들을 O(n)의 시간복잡도로 오름차순 혹은 내림차순 상태로 유지하는 방법이다
- 스택의 top에 있는 숫자와 원하는 숫자와 비교한 후, 조건에 부합하면 pop을 하며 진행
- 중복 없는 오름차순 스택 : s.top () >= tmp 인 경우에 pop()
- 중복 없는 내림차순 스택 : s.top() <= tmp 인 경우에 pop()
풀이 과정
- 10을 입력 받았을 때
- 스택은 비어있으므로 cnt에 스택의 사이즈인 0을 더한 후, 스택에 10을 push 한다
- cnt = 0, stack => 10
- 3을 입력 받았을 때
- 스택은 비어있지 않으므로, while문을 돈다
- s.top()인 10이 3보다 크므로 바로 while문을 빠져나간다
- cnt에 스택의 사이즈인 1을 더한 후, 스택에 3을 push 한다
- cnt = 1, stack => 10, 3
- 7을 입력 받았을 때
- 스택은 비어있지 않으므로, while문을 돈다
- s.top()인 3이 7보다 작으므로 pop()을 한다
- s.top()인 10이 7보다 크므로 while문을 빠져나간다
- cnt에 스택의 사이즈인 1을 더한 후, 스택에 7을 push 한다
- cnt = 2, stack => 10, 7
- 4을 입력 받았을 때
- 스택은 비어있지 않으므로, while문을 돈다
- s.top()인 7이 4보다 크므로 while문을 빠져나간다
- cnt에 스택의 사이즈인 2를 더한 후, 스택에 4를 push 한다
- cnt = 4, stack => 10, 7, 4
- 12를 입력 받았을 때
- 스택은 비어있지 않으므로, while문을 돈다
- s.top()인 4가 12보다 작으므로 pop()을 한다
- s.top()인 7이 12보다 작으므로 pop()을 한다
- s.top()인 10이 12보다 작으므로 pop()을 한다
- 스택이 비어있으므로 while문을 빠져나간다
- cnt에 스택의 사이즈인 0을 더한 후, 스택에 12를 push 한다
- cnt = 4, stack => 12
- 2를 입력 받았을 때
- 스택은 비어있지 않으므로, while문을 돈다
- s.top()인 12가 2보다 크므로 while문을 빠져나간다
- cnt에 스택의 사이즈인 1을 더한 후, 스택에 1을 push 한다
- cnt = 5, stack => 12, 1
=> 내가 내려다 보는 건물의 수가 아니라, 나를 내려다 보는 건물의 수를 구하는 것!
소스 코드
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int n;
cin >> n;
stack<int> s;
long long cnt = 0;
for (int i = 0; i < n; i++)
{
int tmp;
cin >> tmp;
while(!s.empty())
{
if (s.top() > tmp)
break;
s.pop();
}
cnt += s.size();
s.push(tmp);
}
printf("%lld\n", cnt);
return 0;
}
'Algorithm Study' 카테고리의 다른 글
[백준] 17299 오큰등수 (0) | 2023.01.13 |
---|---|
[백준] 17298 오큰수 (0) | 2023.01.13 |
[백준] 2493 탑 (0) | 2023.01.12 |
[백준] 1874 스택 수열 (0) | 2023.01.12 |
[백준] 10773 제로 (0) | 2023.01.12 |