백준
백준[24511]번: queuestack ( JAVA )
하루우울루
2023. 11. 27. 12:37
https://www.acmicpc.net/problem/24511
24511번: queuestack
첫째 줄에 queuestack을 구성하는 자료구조의 개수 $N$이 주어진다. ($1 \leq N \leq 100\,000$) 둘째 줄에 길이 $N$의 수열 $A$가 주어진다. $i$번 자료구조가 큐라면 $A_i = 0$, 스택이라면 $A_i = 1$이다. 셋째 줄
www.acmicpc.net
Code
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // N 입력 받기
int[] arr = new int[N];
link[] ptr = new link[N];
for (int i = 0; i < N; i++) {
ptr[i] = new link();
}
st = new StringTokenizer(br.readLine()); // queue, stack 판별 입력 받기
for(int i=0;i<N;i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine()); // 저장할 값 입력 받기
for(int i=0;i<N;i++) {
int n = Integer.parseInt(st.nextToken());
LinkedList<Integer> k = new LinkedList<>();
k.add(n);
ptr[i].setFlag(arr[i]);
ptr[i].setList(k);
}
st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken()); // 삽입 할 수열 길이
int[] insert = new int[t];
st = new StringTokenizer(br.readLine()); // 수열 입력 받기
for(int i=0;i<t;i++) { // 저장
insert[i] = Integer.parseInt(st.nextToken());
}
int count = 0;
for(int i=ptr.length -1;i>=0;i--) { // ptr의 뒤 부터 확인
if(ptr[i].getFlag() == 0) {
if(count < t) {
bw.write(ptr[i].getList().get(0)+" ");
count++;
}
else {
break;
}
}
}
int p = 0;
while(count < t) {
bw.write(insert[p] + " ");
p++;
count++;
}
br.close();
bw.close();
}
static class link {
private int flag;
private LinkedList<Integer> list;
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public LinkedList<Integer> getList() {
return list;
}
public void setList(LinkedList<Integer> list) {
this.list = list;
}
public link() {
}
public link(int flag,LinkedList<Integer> list) {
this.flag = flag;
this.list = list;
}
}
}
처음 문제를 풀 때 queue일 때와 stack일 경우를 나누어 구현을 했다
그렇게 풀었더니 시간초과가 나서 시간을 줄일 생각을 하다가 stack인 경우에는 나중에 들어간 것이 먼저 나오므로 구현을 안 해도 된다고 생각했다.
그래서 queue가 0일 경우에만 삽입 된 수열의 길이만큼 출력을 해주었다.
0인 경우가 삽입된 수열의 길이보다 작을 경우 입력으로 들어온 삽입된 원소를 그대로 출력해준다.
그 반대인 경우 삽입된 수열의 길이만큼만 출력을 해준다.