본문 바로가기
코딩테스트/백준(BOJ)

[백준] 24511번: queuestack(JAVA)

by hadgehogdev 2023. 10. 3.

▶ 문제

 
 

24511번: queuestack

첫째 줄에 queuestack을 구성하는 자료구조의 개수 $N$이 주어진다. ($1 \leq N \leq 100\,000$) 둘째 줄에 길이 $N$의 수열 $A$가 주어진다. $i$번 자료구조가 큐라면 $A_i = 0$, 스택이라면 $A_i = 1$이다. 셋째 줄

www.acmicpc.net

한가롭게 방학에 놀고 있던 도현이는 갑자기 재밌는 자료구조를 생각해냈다. 그 자료구조의 이름은 queuestack이다.

queuestack의 구조는 다음과 같다. 1번, 2번, ... , 번의 자료구조(queue 혹은 stack)가 나열되어있으며, 각각의 자료구조에는 한 개의 원소가 들어있다.

queuestack의 작동은 다음과 같다.

  • 을 입력받는다.
  •  1번 자료구조에 삽입한 뒤 1번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 이라 한다.
  • 번 자료구조에 삽입한 뒤 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 이라 한다.
  • ...
  • 번 자료구조에 삽입한 뒤 번 자료구조에서 원소를 pop한다. 그때 pop된 원소를 이라 한다.
  • 을 리턴한다.

도현이는 길이 의 수열 를 가져와서 수열의 원소를 앞에서부터 차례대로 queuestack에 삽입할 것이다. 이전에 삽입한 결과는 남아 있다. (예제 1 참고)

queuestack에 넣을 원소들이 주어졌을 때, 해당 원소를 넣은 리턴값을 출력하는 프로그램을 작성해보자.

입력

첫째 줄에 queuestack을 구성하는 자료구조의 개수 이 주어진다. (1≤ N ≤100000)

둘째 줄에 길이 의 수열 가 주어진다. 번 자료구조가 큐라면 , 스택이라면 이다.

셋째 줄에 길이 의 수열 가 주어진다. 번 자료구조에 들어 있는 원소이다. (1≤ Bi ≤1000000000)

넷째 줄에 삽입할 수열의 길이 이 주어진다. (1≤ M ≤100000)

다섯째 줄에 queuestack에 삽입할 원소를 담고 있는 길이 의 수열 가 주어진다. (1≤ Ci ≤1000000000)

입력으로 주어지는 모든 수는 정수이다.

출력

수열 의 원소를 차례대로 queuestack에 삽입했을 때의 리턴값을 공백으로 구분하여 출력한다.


▶ 풀이

 - JAVA

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.LinkedList;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer A = new StringTokenizer(br.readLine());
        StringTokenizer B = new StringTokenizer(br.readLine());

        LinkedList<Integer> qst = new LinkedList<>();
        for(int i = 0; i < N; i++){
            int isSt = Integer.parseInt(A.nextToken());
            int num = Integer.parseInt(B.nextToken());
            if(isSt == 0)
                qst.add(num);
        }

        int M = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < M; i++){
            qst.addFirst(Integer.parseInt(st.nextToken()));  //qst.add(0, val) 도 가능
            sb.append(qst.pollLast()+" ");
        }

        System.out.print(sb);
    }
}

▶ 메모

스택의 경우 값이 바뀌지 않으므로 큐일 경우(isSt == 0)만 확인해주면 된다.

LinkedList 선언 시 List<Integer> qst 로 하게 될 경우 아래에서 addFirst()와 pollLast() 메소드를 사용하여 오류가 발생한다.