[백준] 22866: 탑 보기 - JAVA
https://www.acmicpc.net/problem/22866
풀이
N개의 건물의 높이가 주어진다.
각 건물의 옥상에서 양 옆을 볼 때, 현재있는 건물의 높이보다 큰 건물만 볼수있고,
큰 건물로 가려지면 볼 수 없다.
스택을 이용해 저장하면서 현재 빌딩보다 낮으면 없애주는 식으로 구현했다.
왼쪽부터, 오른쪽부터 두번에 걸쳐 스택에 저장하는 과정을 거쳤다.
왼쪽부터 진행할 때는 현재 건물의 왼쪽을 본다는 것이고 오른쪽부터 진행하면 오른쪽을 본다는 것이다.
메모리: 34648KB
시간: 656ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
static class Building {
int idx;
int height;
public Building(int idx, int height) {
this.idx = idx;
this.height = height;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Building[] arr = new Building[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i < N + 1; i++) {
arr[i] = new Building(i, Integer.parseInt(st.nextToken()));
}
int[] near = new int[N + 1];
int[] cnt = new int[N + 1];
Stack<Building> stack = new Stack<>();
for (int i = 1; i < N + 1; i++) {
while (!stack.isEmpty() && stack.peek().height <= arr[i].height) {
stack.pop();
}
cnt[i] += stack.size();
if (!stack.isEmpty()) {
near[i] = stack.peek().idx;
}
stack.push(arr[i]);
}
stack = new Stack<>();
for (int i = N; i >= 1; i--) {
while (!stack.isEmpty() && stack.peek().height <= arr[i].height) {
stack.pop();
}
cnt[i] += stack.size();
if (!stack.isEmpty()) {
if (near[i] != 0) {
if (i - near[i] > stack.peek().idx - i) {
near[i] = stack.peek().idx;
}
} else {
near[i] = stack.peek().idx;
}
}
stack.push(arr[i]);
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i < N + 1; i++) {
if (cnt[i] != 0) {
sb.append(cnt[i]).append(" ").append(near[i]).append("\n");
} else {
sb.append(cnt[i]).append("\n");
}
}
System.out.println(sb);
}
}