https://www.acmicpc.net/problem/2304
나의풀이
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();
}
}
'코테풀이' 카테고리의 다른 글
[백준] BOJ - 11724 연결 요소의 개수 java(실버2) (0) | 2023.04.12 |
---|---|
[백준] BOJ - 2075 N번째 큰 수 java (실버2) (0) | 2023.04.06 |
[백준] BOJ - 1522 문자열 교환 java 자바 풀이(실버1) (0) | 2023.04.04 |
[백준] BOJ - 2164 카드2 java 자바 (실버4) (0) | 2023.04.02 |
[백준] BOJ - 2607 비슷한 단어 java 자바 (실버3) (0) | 2023.04.02 |