알고리즘/백준
[BaekJoon] 백준 2493번 _ 탑 for JAVA
정석이
2023. 6. 22. 20:34
https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
스택을 활용한 문제이다.
6 9 5 7 4 의 높이를 가진 탑일 때
4의 높이에서 레이저를 쏜다면 7에, 7의 높이에서 레이저를 쏜다면 9에 맞을 것이다.
해당 위치에서 왼쪽 방향으로 레이저를 쐈을 때 몇 번째 건물에 맞는지 구하는 문제이다.
여기서 알아야 할 것은 6 다음에 9를 스택에 넣었을 때, 다음 건물들은 6에 레이저를 절대 맞출 수 없다는 것이다.
그래서 스택에 첫 번째 건물부터 넣으면서 stack의 제일 위 건물의 높이가 현재 건물의 높이보다 작다면 pop 해주면 된다.
모두 pop 해주고 남은 건물에 레이저가 닿게 될 것이므로, 해당 건물의 순서를 담아주면 된다.
그래서 건물의 높이와 건물의 순서(몇 번째 건물인지)를 stack에 int[]로 넣어주었다~!
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
Stack<int[]> stack = new Stack<>(); // 건물의 높이, 건물의 순서
for(int i=1; i<=N; i++) {
int in = Integer.parseInt(st.nextToken());
while(!stack.isEmpty() && stack.peek()[0] < in) {
stack.pop();
}
if(stack.isEmpty()) {
sb.append("0").append(" ");
} else {
sb.append(stack.peek()[1]).append(" ");
}
stack.add(new int[] {in, i});
}
System.out.println(sb.toString());
}
}