문제 링크 - https://www.acmicpc.net/problem/1863
🌱 문제
🌱 풀이
- 어떻게 풀어야 할지 막막해서 백준 힌트를 통해 스택으로 푸는 것이라는걸 알아냈지만 그 이후에도 감이 안와서 구글링을 참고 하였다.
- 다음과 같은 규칙을 찾아내고, 이 과정을 stack을 이용하여 구현아였다.
규칙
- 높이가 높아지면 스택에
push
- 높이가 낮아지면 그 높이보다 높은 건물들의 넓이가 끝나서 그 만큼 스택에서 뽑고
ans++
- 만약 새로운 높이라면 스택에
push
- 원래 있던 높이라면
continue
- 0이란 높이는 저장할 필요 없으므로 stack을 비우면서
ans++
- stack이 비어있으면 무조건
push
- 모든 탐색이 끝나면 stack을 비우면서
ans++
🌱 코드
package _2023.Jan_week02;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class boj_1863 {
static int n;
static int answer;
static int[] height;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n=Integer.parseInt(br.readLine());
height = new int[n];
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
height[i]=Integer.parseInt(st.nextToken());
}
Stack<Integer> stack = new Stack<>();
for(int h :height ) {
if(h==0) {
answer+=stack.size();
stack.clear();
}
else if(!stack.isEmpty()) {
int peek=stack.peek();
if(peek<h) {
stack.push(h);
}else {
while
(!stack.isEmpty() && stack.peek()>h) {
stack.pop();
answer++;
}
if(!stack.isEmpty() && stack.peek()<h)
stack.push(h);
if(stack.isEmpty())
stack.push(h);
}
}else {
stack.push(h);
}
}
answer += stack.size();
stack.clear();
System.out.println(answer);
}
}