본문 바로가기
Problem Solving/Baekjoon

[백준] 2304 창고 다각형 - Data Structure / Java

by graycode 2022. 12. 18.

 문제 링크

 

2304번: 창고 다각형

첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의

www.acmicpc.net

 

 풀이 과정

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[1001];
        int src = 1000;
        int dest = 0;

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int l = Integer.parseInt(st.nextToken());
            int h = Integer.parseInt(st.nextToken());

            arr[l] = h;
            src = Math.min(src, l);
            dest = Math.max(dest, l);
        }

        Stack<Integer> stk = new Stack<>();

        int pivot = arr[src];
        for (int i = src + 1; i <= dest; i++) {
            if (arr[i] < pivot)
                stk.push(i);
            else {
                while (!stk.empty())
                    arr[stk.pop()] = pivot;
                pivot = arr[i];
            }
        }

        stk.clear();

        pivot = arr[dest];
        for (int i = dest - 1; i >= src; i--) {
            if (arr[i] < pivot)
                stk.push(i);
            else {
                while (!stk.empty())
                    arr[stk.pop()] = pivot;
                pivot = arr[i];
            }
        }

        int res = 0;
        for (int i = src; i <= dest; i++)
            res += arr[i];

        bw.write(String.valueOf(res));
        bw.flush();
    }

}

댓글