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

2025. 2. 25. 16:26ยทAlgorithm & Data Structures/BOJ

 

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) ํ’€์ด๋กœ ํšจ์œจ์ 
โœ… ๋ณผ ์ˆ˜ ์žˆ๋Š” ์Œ์„ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
โœ… ๋‹ค๋ฅธ "๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ ์Œ" ๋ฌธ์ œ์—์„œ๋„ ํ™œ์šฉ ๊ฐ€๋Šฅ

 

 

 

'Algorithm & Data Structures > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

b24444. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 1  (0) 2025.03.04
b24480. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 2  (0) 2025.03.01
b.1725 ํžˆ์Šคํ† ๊ทธ๋žจ  (0) 2025.02.06
b.17299 ์˜ค๋“ฑํฐ์ˆ˜  (1) 2025.02.04
b24497. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 1  (0) 2025.01.27
'Algorithm & Data Structures/BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • b24444. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ 1
  • b24480. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 2
  • b.1725 ํžˆ์Šคํ† ๊ทธ๋žจ
  • b.17299 ์˜ค๋“ฑํฐ์ˆ˜
Geisha
Geisha
๊ฐœ๋ฐœ ์ผ๊ธฐ
  • Geisha
    Geisha
    Geisha
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (329) N
      • Algorithm & Data Structures (249) N
        • BOJ (107) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (27)
        • SQL (21)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • ์šด์˜์ฒด์ œ (13)
        • ๋„คํŠธ์›Œํฌ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    DynamicProgramming
    baekjoon
    Java
    ๋™์ ๊ณ„ํš๋ฒ•
    ๋ฐฑํŠธ๋ž˜ํ‚น
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    SQL
    Union-Find
    ๋‹ค์ต์ŠคํŠธ๋ผ
    ๊ตฌํ˜„
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ํˆฌํฌ์ธํ„ฐ
    ํ›„์œ„์ˆœํšŒ
    Dijkstra
    binarySearch
    algorithm
    Stack
    PriorityQueue
    programmers
    dp
    ๊ณจ๋“œ
    ๊ฒฝ๋กœ์••์ถ•
    BFS
    dfs
    ๋ฐฑ์ค€
    ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ
    ์ž๋ฐ”
    ์Šคํƒ
    ์ด๋ถ„ํƒ์ƒ‰
    ์ „์œ„์ˆœํšŒ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Geisha
b3015. ์˜ค์•„์‹œ์Šค ์žฌ๊ฒฐํ•ฉ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”