SMALL
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
- 문제
- 문제풀이
처음에는 문제에서 요구하는 그대로 작성했다가 시간초과가 발생했다.
using System;
using System.Collections.Generic;
using System.Text;
namespace QueueStackSimulation
{
class Program
{
static void Main(string[] args)
{
int N = int.Parse(Console.ReadLine());
int[] structureTypes = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int[] structureData = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
List<Queue<int>> queues = new List<Queue<int>>();
List<Stack<int>> stacks = new List<Stack<int>>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++)
{
if (structureTypes[i] == 0)
{
Queue<int> queue = new Queue<int>();
queue.Enqueue(structureData[i]);
queues.Add(queue);
}
else
{
Stack<int> stack = new Stack<int>();
stack.Push(structureData[i]);
stacks.Add(stack);
}
}
int M = int.Parse(Console.ReadLine());
int[] insertData = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
foreach (int data in insertData)
{
int result = -1; // Default value
for (int i = 0; i < N; i++)
{
if (queues.Count > i && queues[i].Count > 0)
{
result = queues[i].Dequeue();
}
else if (stacks.Count > i && stacks[i].Count > 0)
{
result = stacks[i].Pop();
}
if (result == data)
{
sb.Append(result + " ");
break;
}
}
}
Console.WriteLine(sb.ToString().Trim());
}
}
}
스택은 처음 숫자가 그대로 남고 큐만 숫자가 변동 된다는 것을 알게 되었다. 따라서 스택은 무시하고 큐의 규에만 집중하여 코드를 짜면 해결할 수 있다.
- 코드 1
using System;
using System.Collections.Generic;
using System.Text;
namespace CodeConversion
{
class Program
{
static void Main(string[] args)
{
int N = int.Parse(Console.ReadLine());
int[] sequence_A = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int[] sequence_B = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int M = int.Parse(Console.ReadLine());
int[] sequence_C = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
StringBuilder sb = new StringBuilder();
Queue<int> queue = new Queue<int>();
for (int i = N - 1; i >= 0; i--)
{
if (sequence_A[i] == 0)
{
queue.Enqueue(sequence_B[i]);
}
}
for (int i = 0; i < M; i++)
{
queue.Enqueue(sequence_C[i]);
sb.Append(queue.Dequeue() + " ");
}
Console.WriteLine(sb.ToString());
}
}
}
- 후기
더 좋은 코드로 만들기 위해 손으로 직접해보는 것은 중요한 것 같다.
LIST
'백준 > C#' 카테고리의 다른 글
[C#]백준 17268번: 미팅의 저주 (0) | 2023.09.25 |
---|---|
[C#]백준 2579번: 계단 오르기 (0) | 2023.09.25 |
[C#]백준 16928번: 뱀과 사다리 게임 (0) | 2023.08.25 |
[C#]백준 1149번: RGB거리 (0) | 2023.08.25 |
[C#]백준 1912번: 연속합 (0) | 2023.08.25 |