티스토리 뷰
2493 탑
// 210204
import java.io.*;
import java.util.*;
public class Main_2493_탑 {
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(), " ");
int[] input = new int[N];
for (int i=0; i<N; i++) {
input[i] = Integer.parseInt(st.nextToken());
}
int[] ans = new int[N];
Stack<Integer> stack = new Stack<Integer>();
Stack<Integer> index = new Stack<Integer>(); // index 저장
for (int i=0; i<N; i++) {
while(true) {
if (stack.isEmpty()) {
stack.add(input[i]); index.add(i+1);
break;
} else {
int top = stack.pop();
int topIndex = index.pop();
if (top > input[i]) {
ans[i] = topIndex;
stack.add(top); index.add(topIndex);
stack.add(input[i]); index.add(i+1);
break;
}
}
}
} // for
// 출력
StringBuilder sb = new StringBuilder();
for (int i=0; i<N; i++) {
sb.append(ans[i] + " ");
}
System.out.println(sb.toString());
br.close();
}
}
스택을 사용하지 않으면 시간 초과가 나는 문제이다.
1. 스택이 비어있다면 왼쪽에 현재 탑보다 높은 탑이 없기 때문에 정답은 0이 된다. 자기 자신은 오른쪽 탑들의 답이 될 수 있기 때문에 자기 자신만 스택에 넣어둔다.
2. 정답으로 채택했던 높이를 스택에 넣어두고, 오른쪽으로 가며 스택을 pop하며 레이저를 수신할 수 있는지 비교한다.
- 스택의 top이 자기 자신보다 높다면 -> 레이저를 수신할 수 있기 때문에 더 이상 비교할 필요가 없다. top과 자기 자신은 오른쪽의 다른 탑들의 정답이 될 수 있기 때문에 차례대로 다시 스택에 넣는다.
- 스택의 top이 자기 자신보다 낮다면 -> 이제 top은 현재 위치 탑에게 막혀서 답이 될 수 없다. while문을 돌며 다음 top을 pop하며 살펴본다.
'코딩테스트 > 백준' 카테고리의 다른 글
[BJ] 1158. 요세푸스 문제 (0) | 2021.02.09 |
---|---|
[BJ] 2164번: 카드 2 (0) | 2021.02.08 |
[BJ] 17478. 재귀함수가뭔가요 (0) | 2021.02.01 |
[백준] 16769: Mixing Milk (0) | 2020.11.15 |
[백준] 9037: The candy war (0) | 2020.11.15 |
댓글