코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
static int N;
static Stack<Integer> stack = new Stack<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
stack.push(Integer.parseInt(br.readLine()));
long ans = 0;
for (int i = 1; i < N; i++) {
int current = Integer.parseInt(br.readLine());
while (!stack.isEmpty() && stack.peek() <= current) stack.pop();
ans += stack.size();
stack.push(current);
}
System.out.println(ans);
}
}
- Stack을 활용한 풀이
- 각 관리인이 확인 가능한 빌딩의 개수를 세는 것이 아니라, 그 빌딩을 볼 수 있는 관리자의 수를 각각 계산해서 더했다.
- 현재 확인하고 있는 빌딩의 높이가 stack top에 저장된 빌딩값보다 작다면 그냥 push 가능.
- 이전 값들이 그 다음 빌딩에 대해서도 관찰이 가능하므로
- 반대로 더 크거나 같으면 현재 확인하고 있는 빌딩에 의해 시야가 가려지므로 더 높은 빌딩이 나올때까지 pop() 연산을 실행한다.