파이썬 문제풀이

[백준 파이썬] 24511 queuestack

냄비짱 2023. 10. 13. 06:37
728x90

📌문제 출처

백준 단계별 문제풀이 : 스택, 큐, 덱 단계
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

❓ 문제

 

📗 풀이 코드

'''
queue는 선입선출, 후입후출이고 / stack은 선입후출, 후입선출이다.
queue는 원래있던 숫자가 빠지고 / stack은 삽입된 숫자가 빠진다.

이를 이용해 queue일때는 원래 원소와 삽입한 원소를 바꿔주고, stack일때는 삽입한 원소를 그대로 가져가면 된다.

이 원리대로 모든 자료구조에서 append, pop을 해줬더니 시간초과 발생
stack일때는 아무런 변화가 없으므로(통과!) queue 자료구조형일 때의 순서만 변경된다.
queue 자료구조형만 남겨뒀을때
맨 처음 삽입한 숫자가 제일 앞에 있고 제일 마지막의 숫자가 반환되기에
이는 queue인 자료구조형의 원소들만 모아두고 queue를 만들어서 선입선출의 구조로 만들어줘도 된다.
'''
input = open(0).readline

if __name__ == '__main__':
    n = int(input())
    list_type = list(map(int,input().split())) # 큐=0,스택=1
    list_num = list(map(int,input().split())) # 원소
    queue = [list_num[i] for i in range(n) if not list_type[i]] # 큐만 담기
    m = int(input())
    inserts = list(map(int,input().split()))
    # 현재 queue에는 맨 마지막의 원소가 맨 뒤에 있으므로
    # inserts를 포함하여 삽입순서가 오래된 순서로 정렬한다면
    queue = queue[::-1]+inserts
    # 먼저 들어간 순서로 m개만 출력이므로
    print(*queue[:m])