[백준][Java] 2304번 창고 다각형 (스택, 구현..?)

[백준][Java] 2304번 창고 다각형 (스택, 구현..?)

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class Main {

private static BufferedReader br = new BufferedReader( new InputStreamReader( System . in ));

private static BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( System . out ));

public static void main( String [] args) throws IOException{

int N = stoi(br.readLine());

List < int [] > list = new ArrayList < > ();

int res = 0 ;

int maxHeight = 0 ;

for ( int i = 0 ; i < N; i + + ) {

String [] str = br.readLine(). split ( " " );

list. add ( new int [] {stoi(str[ 0 ]), stoi(str[ 1 ])});

maxHeight = Math.max(maxHeight, stoi(str[ 1 ]));

}

Collections.sort(list, (a,b) - > a[ 0 ] - b[ 0 ]);

int firstIdx = - 1 ;

int lastIdx = - 1 ;

int firstX = - 1 ;

int lastX = - 1 ;

for ( int i = 0 ; i < list.size(); i + + ) {

int [] curr = list.get(i);

if (maxHeight = = curr[ 1 ]) {

if (firstIdx = = - 1 ) {

firstIdx = i;

firstX = curr[ 0 ];

}

lastIdx = i;

lastX = curr[ 0 ];

}

}

// 가장 높은 탑들을 미리 계산해주는거임

res + = (lastX - firstX + 1 ) * maxHeight;

// 왼쪽에서 maxHeight를 가진 탑으로

int [] preStick = new int [] { 0 , 0 };

for ( int i = 0 ; i < = firstIdx; i + + ) {

int [] currStick = list.get(i);

if (preStick[ 1 ] < currStick[ 1 ]) {

res + = preStick[ 1 ] * (currStick[ 0 ] - preStick[ 0 ]);

preStick = currStick;

// System.out.println(currStick[0]+" "+currStick[1]);

}

}

// System.out.println();

// 오른쪽에서 maxHeight를 가진 탑으로

preStick = new int [] { 0 , 0 };

for ( int i = list.size() - 1 ; i > = lastIdx; i - - ) {

int [] currStick = list.get(i);

if (preStick[ 1 ] < currStick[ 1 ]) {

res + = preStick[ 1 ] * (preStick[ 0 ] - currStick[ 0 ]);

preStick = currStick;

// System.out.println(currStick[0]+" "+currStick[1]);

}

}

System . out . println (res);

// bw.write("");

// bw.flush();

// bw.close();

}

private static int stoi( String input) {

return Integer. parseInt (input);

}

}

from http://aig2029.tistory.com/348 by ccl(A) rewrite - 2021-10-22 13:01:40