기몽수
코딩 기록일지
기몽수
전체 방문자
오늘
어제
  • 분류 전체보기 (443)
    • 알고리즘 - SWEA (210)
      • D1 (19)
      • D2 (25)
      • D3 (143)
      • D4 (21)
      • D5 (2)
    • 알고리즘 - Programmers (74)
      • Unrated (34)
      • Lv 0 (4)
      • Lv 1 (3)
      • Lv 2 (32)
      • Lv 3 (1)
    • 알고리즘 - Baekjoon (158)
      • Bronze (1)
      • Silver (65)
      • Gold (90)
      • Platinum (2)
    • 취업 (0)
    • SSAFY (1)
hELLO · Designed By 김용수.
기몽수

코딩 기록일지

알고리즘 - Baekjoon/Gold

[Gold V] 옥상 정원 꾸미기 - 6198 - JAVA[자바]

2023. 10. 12. 22:08

문제 링크

성능 요약

메모리: 23500 KB, 시간: 312 ms

분류

자료 구조, 스택

제출 일자

2023년 10월 12일 22:07:20

문제 설명

sook-001(1).jpg

도시에는 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)

출력

  • 각 관리인들이 벤치마킹이 가능한 빌딩의 수의 합을 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;


public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        // 내림차순 정렬된 스택
        Stack<Integer> stack = new Stack<>();

        long result = 0;
        for (int i = 0; i < n; i++) {
            int building = Integer.parseInt(br.readLine());

            // 스택이 비지 않을 동안 실행
            while (!stack.isEmpty()) {

                // 스택의 Top값이 현재 입력 받은 값보다 작다면 pop해줌
                if (stack.peek() <= building) {
                    stack.pop();
                } else {
                    // 더 이상 크지 않다면 break;
                    break;
                }
            }
            // 스택 사이즈를 더해주면서 가능한 개수를 더해준다.
            result += stack.size();
            // 입력 받은 빌딩의 높이를 넣어준다.
            stack.push(building);
        }

        System.out.println(result);
    }
}

'알고리즘 - Baekjoon > Gold' 카테고리의 다른 글

[백준] 1715번 : 카드 정렬하기 Gold 4(골드5) - JAVA[자바]  (1) 2023.10.23
[Gold IV] 오큰수 - 17298 - JAVA[자바]  (0) 2023.10.14
[Gold V] 탑 - 2493 - JAVA[자바]  (0) 2023.10.12
[Gold V] 리모컨 - 1107  (0) 2023.08.03
[Gold V] 암호 만들기 - 1759  (0) 2023.08.01
    '알고리즘 - Baekjoon/Gold' 카테고리의 다른 글
    • [백준] 1715번 : 카드 정렬하기 Gold 4(골드5) - JAVA[자바]
    • [Gold IV] 오큰수 - 17298 - JAVA[자바]
    • [Gold V] 탑 - 2493 - JAVA[자바]
    • [Gold V] 리모컨 - 1107
    기몽수
    기몽수

    티스토리툴바