C# StreamReader

RudinP·2023년 3월 24일
0

Study

목록 보기
2/258

백준 [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;
                    }
                }
            }
        }

당연히 이게 문제가 아니니 또 시간초과.
백준 시간초과 문제번호 라고 구글에 검색하니 해결법이 나왔다.

발생 이유

  • Console.ReadLine() 반복 사용으로 인한 시간 초과

    Console.ReadLine()을 하게 되면 키보드 입력을 한 뒤 매번 flush를 해주는 방향으로 실행되어 실행시간이 길어지게 된다고 한다.

해결 방법

  • System.Text의 StreamReader 사용 후 Console.WriteLine()으로 한 번에 작성

    StreamReader을 사용하면 최종적으로 한 번만 flush 하기 때문에 실행시간이 단축된다고 한다.

최종 코드

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());
        }
    }

}
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글