헝D의 일기장
article thumbnail

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

 

2304번: 창고 다각형

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

www.acmicpc.net

 

 

나의풀이

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String args[]) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[1001];//최대 1000이하이므로
        int answer=0;
        int start= Integer.MAX_VALUE;
        int end=0;
        
        int n = Integer.parseInt(st.nextToken()); //기둥의 개수
    
        for(int i=0; i<n; i++){
            st = new StringTokenizer(br.readLine());
            int x= Integer.parseInt(st.nextToken());
            int y= Integer.parseInt(st.nextToken());
            arr[x]=y;
            start= Math.min(start, x);
            end= Math.max(end, x);
        }
        
        Stack<Integer> stack = new Stack<>();
        
        //왼쪽->오른쪽으로 
        int temp=arr[start]; //첫 시작 기둥
        for(int i=start+1; i<= end; i++){
            if(arr[i]<temp){//이전 기둥보다 작은 경우 스택에 넣기
                stack.push(i);
            }
            else{ 
                while(!stack.isEmpty()){
                    int x =stack.pop();
                    arr[x] = temp;//기둥이 없는 좌표, 이전기둥보다 작은 기둥 좌표 높이를 맞춰준다 
                }
                temp=arr[i];
            }
        }
        
        stack.clear();
        
        //오른쪽 ->왼쪽으로 반복
        temp=arr[end]; //마지막 기둥부터
        for(int i=end-1; i>=start; i--){
            if(arr[i] < temp){
                stack.push(i);
            }
            else{ 
                while(!stack.isEmpty()){
                    int x =stack.pop();
                    arr[x] = temp;//기둥이 없는 좌표, 이전기둥보다 작은 기둥 좌표 높이를 맞춰준다 
                }
                temp=arr[i];
            }
            
        }
        
        for(int i=start; i<=end; i++){
            answer+=arr[i];
        }
        bw.write(Integer.toString(answer));
        bw.flush();
        br.close();
        bw.close();
        
    }
}

 

profile

헝D의 일기장

@헝D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!