[백준] 24511 - queuestack
[백준] 24511 - queuestack

[백준] 24511 - queuestack

언어
Python
C
난이도
Sliver 3
다시 풀어보기
다시 풀어보기
알고리즘 유형
작성자
박용성박용성
생성 일시
2024년 09월 22일

🖥️ 시작하며

notion image
문제에서 뒤의 자료구조로 계속 pop 을 한 값을 넘긴다 했는데, 스택은 선입선출이므로 무시된다.
큐만 남기고 선입후출로 해결하면 된다.
그런데 찬찬히 생각해보면, 이렇게 어렵게 풀 필요 없다.
 
  1. 스택의 값은 무시된다. 선입선출이기 때문에 어차피 들어간 값이 다시 나오기 때문이다.
  1. 결국 생각해보면 큐만 남고, 처음 들어간 값들을 역방향으로 출력한 후 새로 들어갈 값들을 정방향으로 출력하면 된다. 예시를 보면 감이 잡힌다.
    1. 예시에서 1, 4 만 남는다. 그 후 2, 4, 7 이 들어오는데 결국 큐의 형태는 7, 4, 2, 1, 4 가 되기 때문에 처음 들어간 1, 4 는 역방향으로, 나머지 나중에 들어온 2, 4, 7 은 정방향으로 출력하면 된다.
 

⚙️ 코드

from collections import deque import sys input = sys.stdin.readline def Solution(N, A, B, M, C): queuestack = deque() # 초기 큐 상태 설정 for i in range(N): if A[i] == 0: # 큐인 경우에만 추가 queuestack.appendleft(B[i]) results = [] for x in C: queuestack.append(x) results.append(queuestack.popleft()) return results if __name__ == "__main__": N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) M = int(input()) C = list(map(int, input().split())) results = Solution(N, A, B, M, C) print(*results)
#include <stdio.h> #include <stdlib.h> void *Solution(int N, int *A, int *B, int M, int *C) { for (int i = N - 1; M != 0 && i >= 0; --i) { if (A[i] == 0) { // 스택이 아닌 큐라면 역방향으로 출력 printf("%d ", B[i]); --M; } } for (int i = 0; M != 0; ++i) { printf("%d ", C[i]); --M; } } int main() { int N, M; scanf("%d", &N); // 값들 입력받기 int *A = (int *)malloc(N * sizeof(int)); int *B = (int *)malloc(N * sizeof(int)); for (int i = 0; i < N; i++) { scanf("%d", &A[i]); } for (int i = 0; i < N; i++) { scanf("%d", &B[i]); } scanf("%d", &M); int *C = (int *)malloc(M * sizeof(int)); for (int i = 0; i < M; i++) { scanf("%d", &C[i]); } Solution(N, A, B, M, C); free(A); free(B); free(C); return 0; }
 

📌 소감

스택을 없애는 발상까진 쉽지만 더 쉽게 풀 수 있는 방법으로 나아가는 건 어려울 수 있다.
 

댓글

guest