요즘에는 다시 백준 단계별로 풀어보기를 차근차근 풀어보는 중이어서 블로그에는 적지 않고 깃허브에만 올리고 있다. (아무도 안 궁금하겠지만... 깃헙 주소: https://github.com/eunju-lee-991/backjoon-step-by-step.git)
그런데 스택, 큐, 덱 단계에서 메모리 제한이나 시간 제한을 둔 문제들이 꽤 나왔고 24511 queuestack에서 시간 초과로 많은 빠꾸... 아니 고배를 마셨기에 복기해보려고 한다.
처음에는 그냥 단순히 배열로 풀어보려다 -> 시간초과
배열을 2개 써서? 2차원 배열로 간다 -> 시간초과
배열을 0(queue)만 저장 -> 시간초과
0(queue)인 값의 갯수까지 저장해서 그만큼만 for문 -> 시간초과
......
결국 구글링해서 Deque를 쓰면 된다는 걸 깨달았다.
사실 나는 스택,큐,덱에서 덱이 뭔지도 몰랐던 사람인지라 Deque가 한 번에 생각나지 않았던 것 같다.
막상 깨닫고 나니 어렵지 않은 문제였다!
Deque를 잘 기억해두자
import java.io.*;
import java.util.*;
// 24511 queuestack
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
Deque<Integer> deque = new ArrayDeque<>();
StringTokenizer tokenizer = new StringTokenizer(br.readLine());
StringTokenizer tokenizer2 = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
String value = tokenizer2.nextToken();
if (tokenizer.nextToken().equals("0")) {
deque.add(Integer.parseInt(value));
}
}
n = Integer.parseInt(br.readLine());
tokenizer = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
int input = Integer.parseInt(tokenizer.nextToken());
deque.offerFirst(input);
bw.write(deque.pollLast() + " ");
}
br.close();
bw.flush();
bw.close();
}
}