728x90
스택
해당 유형의 문제는 스택 자료구조를 사용하여 O(N)으로 문제를 해결할 수 있다.
스택에는 항상 “현재 인덱스보다 높은 탑들의 인덱스들”만 들어있다. 1부터 N까지의 인덱스를 순회하면서, 현재 인덱스보다 낮은 탑들의 인덱스를 스택에서 제거한다. 스택의 최상위에는 레이저가 처음으로 도달하는 탑의 인덱스가 항상 위치하게 된다.
Stack<Integer> stack = new Stack<>();
for(int i=1; i<=N; i++){
while(!stack.isEmpty() && (tower[stack.peek()] <= tower[i])){
stack.pop();
}
if(stack.isEmpty()) sb.append(0+" ");
else sb.append(stack.peek()+" ");
stack.add(i);
}
코드
import java.io.*;
import java.util.*;
//716ms, O(N)
public class Main {
static int N;
static int[] tower;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
tower = new int[N+1];
st = new StringTokenizer(br.readLine());
for(int i=1; i<=N; i++) tower[i] = Integer.parseInt(st.nextToken());
StringBuilder sb = new StringBuilder();
Stack<Integer> stack = new Stack<>();
for(int i=1; i<=N; i++){
while(!stack.isEmpty() && (tower[stack.peek()] <= tower[i])){
stack.pop();
}
if(stack.isEmpty()) sb.append(0+" ");
else sb.append(stack.peek()+" ");
stack.add(i);
}
System.out.println(sb);
}
}
https://www.acmicpc.net/problem/2493
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[알고리즘]백준 2206: 벽 부수고 이동하기 (1) | 2024.08.06 |
---|---|
[알고리즘]백준 2304: 창고다각형, 백준 14719번: 빗물 (0) | 2024.08.05 |
[알고리즘]백준 12015: 가장 긴 증가하는 부분수열(LIS) (0) | 2024.07.12 |
[알고리즘]백준 2098: 외판원 순회(TSP) (0) | 2024.07.09 |
[알고리즘]백준 1238: 파티 (0) | 2024.06.23 |