728x90
문제 설명
도시에는 N개의 빌딩이 있다.
빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다.
i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으로만 볼 수 있다.
i번째 빌딩 관리인이 볼 수 있는 다른 빌딩의 옥상 정원은 i+1, i+2, .... , N이다.
그런데 자신이 위치한 빌딩보다 높거나 같은 빌딩이 있으면 그 다음에 있는 모든 빌딩의 옥상은 보지 못한다.
예) N=6, H = {10, 3, 7, 4, 12, 2}인 경우
=
= =
= - =
= = = -> 관리인이 보는 방향
= - = = =
= = = = = =
10 3 7 4 12 2 -> 빌딩의 높이
[1][2][3][4][5][6] -> 빌딩의 번호
- 1번 관리인은 2, 3, 4번 빌딩의 옥상을 확인할 수 있다.
- 2번 관리인은 다른 빌딩의 옥상을 확인할 수 없다.
- 3번 관리인은 4번 빌딩의 옥상을 확인할 수 있다.
- 4번 관리인은 다른 빌딩의 옥상을 확인할 수 없다.
- 5번 관리인은 6번 빌딩의 옥상을 확인할 수 있다.
- 6번 관리인은 마지막이므로 다른 빌딩의 옥상을 확인할 수 없다.
따라서, 관리인들이 옥상정원을 확인할 수 있는 총 수는 3 + 0 + 1 + 0 + 1 + 0 = 5이다.
입력
- 첫 번째 줄에 빌딩의 개수 N이 입력된다.(1 ≤ N ≤ 80,000)
- 두 번째 줄 부터 N+1번째 줄까지 각 빌딩의 높이가 hi 입력된다. (1 ≤ hi ≤ 1,000,000,000)
출력
- 각 관리인들이 벤치마킹이 가능한 빌딩의 수의 합을 출력한다.
문제풀이
스택 너무너무너무 어렵다. 며칠전에 푼 탑 같은 문제가 많은거같은데 O(N)안에 어떻게 풀어야할지 감이 안온다.
그래서 이번에도 1시간 붙잡고있다가 다른 풀이를 봤는데 monotone stack을 이용해서 푼다고한다.
while문을 돌면서 push하기전에 현재 탑보다 입력 h가 더 크고 stack이 비어있는지 확인을 한다음에 push를 하는 과정을 반복하면서 값을 넣는 방식으로 문제를 푼거같다.
코드
#include <iostream>
#include <stack>
using namespace std;
int N, h;
stack<long long> stk;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
long long total = 0;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> h;
while (!stk.empty() && stk.top() <= h)
{
stk.pop();
}
total = (long long)stk.size() + total;
stk.push(h);
}
cout << total << "\n";
}
비슷한 유형을 많이 풀어봐야지 감이올듯..
728x90
'알고리즘 > 문제풀이 (C++,Kotlin)' 카테고리의 다른 글
[BOJ/C++] 1021번 회전하는 큐 (0) | 2023.01.06 |
---|---|
[BOJ/C++] 17298번 오큰수 (0) | 2023.01.04 |
[BOJ/C++] 2493번 탑 (0) | 2022.12.30 |
[BOJ/C++] 5397번 키로거 (0) | 2022.12.26 |
[BOJ/C++] 3273번 두 수의 합 (0) | 2022.12.26 |