on
[백준][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