🖥️ 시작하며
문제에서 뒤의 자료구조로 계속
pop
을 한 값을 넘긴다 했는데, 스택은 선입선출이므로 무시된다.큐만 남기고 선입후출로 해결하면 된다.
그런데 찬찬히 생각해보면, 이렇게 어렵게 풀 필요 없다.
- 스택의 값은 무시된다. 선입선출이기 때문에 어차피 들어간 값이 다시 나오기 때문이다.
- 결국 생각해보면 큐만 남고, 처음 들어간 값들을 역방향으로 출력한 후 새로 들어갈 값들을 정방향으로 출력하면 된다. 예시를 보면 감이 잡힌다.
예시에서
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; }
📌 소감
스택을 없애는 발상까진 쉽지만 더 쉽게 풀 수 있는 방법으로 나아가는 건 어려울 수 있다.
댓글