백준 [10845] 제로(스택) 문제를 풀던 중 발생한 문제로 찾아보게 되었다.
using System;
using System.Reflection;
namespace BaekJoon
{
public class Queue
{
int fp = 0;
int bp = 0;
int[] queue;
Queue(int val)
{
queue = new int[val];
}
void push(int num)
{
if (isFull())
{
Console.WriteLine("Queue Full");
}
else
{
queue[bp++] = num;
}
}
bool isFull()
{
if(bp == queue.Length)
return true;
else return false;
}
int pop()
{
if(fp == bp)
{
Console.WriteLine("-1");
return 0;
}
else
{
int a = queue[fp++];
Console.WriteLine(a);
return a;
}
}
void size()
{
Console.WriteLine(bp - fp);
}
void empty()
{
if(fp == bp)
{
Console.WriteLine(1);
}
else
{
Console.WriteLine(0);
}
}
void front()
{
if (fp == bp)
{
Console.WriteLine("-1");
}
else
{
Console.WriteLine(queue[fp]);
}
}
void back()
{
if (fp == bp)
{
Console.WriteLine("-1");
}
else
{
Console.WriteLine(queue[bp-1]);
};
}
static void Main(string[] args)
{
int size=int.Parse(Console.ReadLine());
Queue que = new Queue(size);
string s;
for(int i = 0; i < size; i++)
{
s = Console.ReadLine();
if (s.Contains("push")){
string[] ss = s.Split();
que.push(int.Parse(ss[1]));
}
else if (s.Contains("pop"))
{
que.pop();
}
else if (s.Contains("size"))
{
que.size();
}
else if (s.Contains("empty"))
{
que.empty();
}
else if (s.Contains("front"))
{
que.front();
}
else if (s.Contains("back"))
{
que.back();
}
else
{
return;
}
}
}
}
}
Visual Studio 작동 확인 후, 제출하였더니 시간 초과 문제가 발생하였다.
처음에는 case를 안써서 그런가 싶어서 case로 변경하였다.
(Main 부분)
static void Main(string[] args)
{
int size=int.Parse(Console.ReadLine());
Queue que = new Queue(size);
string s;
for(int i = 0; i < size; i++)
{
s = Console.ReadLine();
if (s.Contains("push")){
string[] ss = s.Split();
que.push(int.Parse(ss[1]));
}
else
{
switch (s)
{
case "pop": que.pop(); break;
case "size": que.size(); break;
case "empty": que.empty(); break;
case "front": que.front(); break;
case "back": que.back(); break;
default: return;
}
}
}
}
당연히 이게 문제가 아니니 또 시간초과.
백준 시간초과 문제번호 라고 구글에 검색하니 해결법이 나왔다.
using System.Text;
namespace BaekJoon
{
public class Queue
{
int fp = 0;
int bp = 0;
int[] queue;
StringBuilder sb;
Queue(int val)
{
queue = new int[val];
sb = new StringBuilder();
}
void push(int num)
{
queue[bp++] = num;
}
void pop()
{
if (fp == bp)
{
sb.Append("-1\n");
}
else
{
int a = queue[fp++];
sb.Append(a + "\n");
}
}
void size()
{
sb.Append((bp - fp) + "\n");
}
void empty()
{
if (fp == bp)
{
sb.Append(1 + "\n");
}
else
{
sb.Append(0 + "\n");
}
}
void front()
{
if (fp == bp)
{
sb.Append("-1\n");
}
else
{
sb.Append(queue[fp] + "\n");
}
}
void back()
{
if (fp == bp)
{
sb.Append("-1\n");
}
else
{
sb.Append(queue[bp - 1] + "\n");
};
}
static void Main(string[] args)
{
int size = int.Parse(Console.ReadLine());
Queue que = new Queue(size);
for (int i = 0; i < size; i++)
{
string[] text = Console.ReadLine().Split();
switch (text[0])
{
case "push": que.push(int.Parse(text[1])); break;
case "pop": que.pop(); break;
case "size": que.size(); break;
case "empty": que.empty(); break;
case "front": que.front(); break;
case "back": que.back(); break;
default: return;
}
}
Console.WriteLine(que.sb.ToString());
}
}
}