6198 - 옥상 정원 꾸미기(java)

Byung Seon Kang·2022년 12월 4일
0

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

/**
 * @Author: kbs
 */
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() 연산을 실행한다.
profile
왜 필요한지 질문하기

0개의 댓글