
- 입력 : 빌딩의 갯수 N (1 <= N <= 8*10^4),
각 빌딩의 높이 h (1 <= h <= 10^9)
- 출력 : 각 관리인들이 벤치마킹이 가능한 빌딩의 수의 합
확인할 수 있는 옥상의 조건은
- 자신(빌딩)보다 빌딩번호가 크다.
2. 자신보다 높이가 작다.
두 조건을 모두 만족해야 한다.
직관적으로 떠오른 생각은 이중반복문을 이용한 일일히 빌딩 크기를 비교하는것이지만, O(N^2)으로 시간초과가 난다.
빌딩번호가 큰 경우만 비교하면 되니, i번 빌딩의 높이 h가 입력될 때마다, h를 확인할 수 있는(h보다 높은) 빌딩만 스택에 남기고, 해당 빌딩(i번 h 높이)을 확인가능한 빌딩의 갯수를 총 횟수 cnt에 매번 더한다.
예시를 이용하면 다음과 같다.

스택 그림을 보면, 스택은 항상 내림차순을 유지하는 단조 감소 스택이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long cnt = 0;
int N = Integer.parseInt(br.readLine());
Stack<Long> stack = new Stack<>();
for(int i = 0; i < N; i++){
long h = Long.parseLong(br.readLine());
while (!stack.isEmpty() && h >= stack.peek()){
stack.pop();
}
stack.push(h);
cnt += stack.size() - 1;
}
System.out.println(cnt);
}
}
O(N)
Monotonic Stack(단조 스택) 은 항상 증가하거나 감소하는(단조적인) 순서를 유지하는 스택이다. 각 원소가 push()와 pop()을 한번씩만 수행하여 O(N)을 보장한다.
스택문제를 오랜만에 풀다 보니, 역발상해야하는 스택 활용 풀이가 빨리 생각이 안났다. 스택 유형 문제도 많이 풀어보자. 단조 스택 유형도 새로 배웠다.