백준

백준[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인 경우가 삽입된 수열의 길이보다 작을 경우 입력으로 들어온 삽입된 원소를 그대로 출력해준다.

그 반대인 경우 삽입된 수열의 길이만큼만 출력을 해준다.