

시간초과 코드
import java.io.*;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
static LinkedList<Integer> queuestack = new LinkedList<>();
public static void main(String[] args) throws IOException{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer;
StringBuilder stringBuilder = new StringBuilder();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
int temp = 0;
// 첫째 줄: 자료구조의 개수 N
int N = Integer.parseInt(bufferedReader.readLine());
//둘째 줄: 0이면 큐, 1이면 스택
int[] arrA = new int[N];
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i = 0; i < N; i++) {
temp = Integer.parseInt(stringTokenizer.nextToken());
arrA[i] = temp;
}
// 셋째 줄: 수열 B는 i번째 자료구조에 들어있는 원소
int[] arrB = new int[N];
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i = 0; i < N; i++){
temp = Integer.parseInt(stringTokenizer.nextToken());
arrB[i] = temp;
if(arrA[i] == 0){
queuestack.push(temp);
}
}
// 넷째 줄: 수열의 길이 M 주어짐
int M = Integer.parseInt(bufferedReader.readLine());
//다섯째 줄: 길이 M의 수열 C
int[] arrC = new int[M];
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i = 0; i < M; i++){
temp = Integer.parseInt(stringTokenizer.nextToken());
arrC[i] = temp;
if(arrA[i] == 0){
queuestack.add(temp);
}
}
for(int i = 0; i < M; i++){
stringBuilder.append(queuestack.get(i)).append(" ");
}
bufferedWriter.write(String.valueOf(stringBuilder));
bufferedWriter.flush();
bufferedReader.close();
bufferedWriter.close();
}
}
정답 코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(bufferedReader.readLine());
int[] arr = new int[N];
Deque<Integer> deque = new ArrayDeque<>();
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(stringTokenizer.nextToken());
}
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i = 0; i < N; i++) {
int num = Integer.parseInt(stringTokenizer.nextToken());
if (arr[i] == 0)
deque.addLast(num);
}
int M = Integer.parseInt(bufferedReader.readLine());
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for(int i = 0; i < M; i++) {
deque.addFirst(Integer.parseInt(stringTokenizer.nextToken()));
bufferedWriter.write(deque.pollLast()+" ");
}
bufferedWriter.flush();
}
}
시간 초과가 난 이유는 다음과 같다.
1. for(int i = 0; i < M; i++){
stringBuilder.append(queuestack.get(i)).append(" ");
}
get(i) 방식으로 값을 참조하는 방식은 시간복잡도가 O(n)으로 시간이 오래 걸린다.
2. static LinkedList<Integer> queuestack = new LinkedList<>();
LinkedList를 사용하면 값을 push 또는 add할 때 넣는 순서가 달라질 수 있다.
3. bufferedWriter.write(String.valueOf(stringBuilder));
stringBuilder에 값을 넣고 출력하는 방식은 비효율적이다. deque를 구현하면 poll을 통해 바로 값을 출력할 수 있다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준_JAVA_알고리즘] 11279 최대 힙 #힙 #우선순위 큐 (0) | 2024.12.19 |
---|---|
[백준_JAVA_알고리즘] 11286 절댓값 힙 #힙 #우선순위 큐 (1) | 2024.12.15 |
[백준_JAVA_알고리즘] 11729 하노이 탑 이동 순서 (0) | 2024.06.29 |
[백준_JAVA_알고리즘] 1269 대칭 차집합 (2) | 2024.06.26 |
[백준_JAVA_알고리즘] 11478 서로 다른 부분 문자열의 개수 (2) | 2024.06.22 |