Algorithm & Data Structures/BOJ

b3015. ์˜ค์•„์‹œ์Šค ์žฌ๊ฒฐํ•ฉ

Geisha 2025. 2. 25. 16:26

 

https://www.acmicpc.net/problem/3015

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ์˜ค์•„์‹œ์Šค ์žฌ๊ฒฐํ•ฉ ๋ฌธ์ œ ํ’€์ด ๐Ÿš€


๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

์ด ๋ฌธ์ œ๋Š” ๋ฐฑ์ค€ 3015๋ฒˆ - ์˜ค์•„์‹œ์Šค ์žฌ๊ฒฐํ•ฉ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ฃผ์–ด์ง„ ์‚ฌ๋žŒ๋“ค์˜ ํ‚ค ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.


๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

7
2
4
1
2
2
5
1

๐Ÿ’ก ์˜ˆ์ œ ์ถœ๋ ฅ

10

๐Ÿ›  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ(Stack) ์„ ํ™œ์šฉํ•œ O(N) ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โœ๏ธ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ

โœ” ๊ฐ ์‚ฌ๋žŒ์˜ ํ‚ค(h)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์Œ์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โœ” ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โœ” ์Šคํƒ์—๋Š” ํ•ญ์ƒ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ €์žฅํ•˜์—ฌ, ํ˜„์žฌ ํ‚ค๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ์„ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
โœ” ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ค„์ž…๋‹ˆ๋‹ค.


๐Ÿ”น Java ์ฝ”๋“œ ํ•ด์„ค

import java.io.*;
import java.util.Stack;

public class Main {

    static class Node {
        int height;
        int count;

        public Node(int h, int cnt) {
            this.height = h;
            this.count = cnt;
        }
    }

    static int N;
    static Stack<Node> st;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        st = new Stack<>();
        long answer = 0;

        for (int i = 0; i < N; i++) {
            int height = Integer.parseInt(br.readLine());
            int count = 1;

            // ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ์„ ๊ณ„์‚ฐ
            while (!st.isEmpty() && st.peek().height <= height) {
                Node top = st.pop();
                answer += top.count;

                if (top.height == height) {
                    count += top.count;
                }
            }

            // ์Šคํƒ์ด ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ถ”๊ฐ€๋กœ 1์Œ์„ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ์Œ
            if (!st.isEmpty()) {
                answer++;
            }

            st.push(new Node(height, count));
        }

        System.out.println(answer);
    }
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

๐Ÿ“Œ 1. ์Šคํƒ ํ™œ์šฉํ•œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ ๊ณ„์‚ฐ

static Stack<Node> st;
  • ์Šคํƒ์—๋Š” {ํ‚ค, ๊ฐ™์€ ํ‚ค์˜ ๊ฐœ์ˆ˜} ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํƒ์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์œ ์ง€๋˜๋ฉฐ, ๋‚ฎ์•„์ง€๋Š” ๊ฒฝ์šฐ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ณ„์‚ฐํ•˜๋ฉด์„œ pop()ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ 2. ํ˜„์žฌ ํ‚ค๋ณด๋‹ค ์ž‘์€ ํ‚ค๋“ค์€ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๋ฉฐ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ ๊ณ„์‚ฐ

while (!st.isEmpty() && st.peek().height <= height) {
    Node top = st.pop();
    answer += top.count;

    if (top.height == height) {
        count += top.count;
    }
}

๐Ÿ”น ๋™์ž‘ ๋ฐฉ์‹

  • ํ˜„์žฌ ํ‚ค๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค์€ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•˜๋ฉด์„œ ์นด์šดํŠธ
  • ์ œ๊ฑฐ๋œ ํ‚ค๋“ค์€ ํ˜„์žฌ ์‚ฌ๋žŒ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ answer ์— ์ถ”๊ฐ€
  • ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ count๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ

๐Ÿ“Œ 3. ์Šคํƒ์ด ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ถ”๊ฐ€ ์Œ ์ถ”๊ฐ€

if (!st.isEmpty()) {
    answer++;
}
  • ์Šคํƒ์ด ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ํ˜„์žฌ ์‚ฌ๋žŒ์€ ์ด์ „ ์‚ฌ๋žŒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ๋”ฐ๋ผ์„œ answer๋ฅผ +1 ์ฆ๊ฐ€

๐Ÿ“Œ 4. ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์ถ”๊ฐ€

st.push(new Node(height, count));
  • ํ˜„์žฌ ์‚ฌ๋žŒ์„ ์Šคํƒ์— ์ถ”๊ฐ€ (ํ‚ค์™€ ํ•จ๊ป˜, ๊ฐ™์€ ํ‚ค ๊ฐœ์ˆ˜ ์ €์žฅ)

๐Ÿ”ฅ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์—ฐ์‚ฐ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ˆ˜ํ–‰ ํšŸ์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„
for ๋ฃจํ”„ N O(N)
while ๋ฃจํ”„ (์Šคํƒ์—์„œ pop) N O(N)
์ดํ•ฉ   O(N)

โœ… ๋ชจ๋“  ์—ฐ์‚ฐ์ด O(N) ์ด๋‚ด๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๋งค์šฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.


๐Ÿ† ์ •๋ฆฌ

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

โœ” ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ์„ ํšจ์œจ์ ์œผ๋กœ ๊ณ„์‚ฐ
โœ” ๊ฐ™์€ ํ‚ค๋Š” ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ ๋ฐฉ์ง€
โœ” ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(N)์œผ๋กœ ์ตœ์ ํ™”ํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ


๐ŸŽฏ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์žฅ์ 

โœ… ์Šคํƒ์„ ํ™œ์šฉํ•œ O(N) ํ’€์ด๋กœ ํšจ์œจ์ 
โœ… ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ์„ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
โœ… ๋‹ค๋ฅธ "๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ ์Œ" ๋ฌธ์ œ์—์„œ๋„ ํ™œ์šฉ ๊ฐ€๋Šฅ