SMALL

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net


  • 문제


  • 문제풀이

첫번째 줄에서 N을 받아 N번동안 입력값을 받아 문자에 따른 숫자만 출력하면 될 줄 알았다.

namespace BaekJoon
{
    internal class Program
    {

        static void Main(string[] args)
        {
            Stack<int> stack = new Stack<int>();
            int N=int.Parse(Console.ReadLine());
            for(int i = 0; i < N; i++)
            {
                string[] input = Console.ReadLine().Split();
                if (input[0]=="push")
                {
                    stack.Push(int.Parse(input[1]));
                }
                else if (input[0] == "pop")
                {
                    if(stack.Count==0)
                    {
                        Console.WriteLine("-1");
                    }
                    else
                    {
                        Console.WriteLine(stack.Pop());
                    }
                }
                else if (input[0] == "size")
                {
                    Console.WriteLine(stack.Count());
                }
                else if (input[0] == "empty")
                {
                    if(stack.Count()==0)
                    {
                        Console.WriteLine("1");
                    }
                    else
                    {
                        Console.WriteLine("0");
                    }
                }
                else
                {
                    if (stack.Count() == 0)
                    {
                        Console.WriteLine("-1");
                    }
                    else
                    {
                        Console.WriteLine(stack.Peek());
                    }
                }
                
            }
        }
    }
}

이렇게 입력을 하게 된다면 시간 초과가 뜨게 된다.

Console.WriteLine은 시간이 많이 걸리는 작업이기 때문에 여러번 호출하면 시간이 오래 걸리게 되고, 시간이 초과가 된다.

Console.WriteLine을 최소화하기 위해서는 StringBuilder을 사용한다.

 

StringBuilder

  • String
    • 변경할 수 없는 형식
    • 변경을 하면 변경된 문자열을 위한 새로운 String을 만들어 냄
    • 반복적으로 계속 String을 변경하면 성능 저하가 일어난다.
  • StringBuilder
    • 변경 가능한 문자열 Class
    • Indexof()StartsWith()같은 검색 메서드가 부족해 필요하다면 다시 String으로 변환해 사용해야 한다.
    • 메서드
      • .Append
      • .AppendLine
      • .Insert
      • .Replace
      • .Length
      • .ToString()

선언 방식은 다른 자료구조 처럼 StringBuilder 이름 = new StringBuilder();을 통해 선언한다. String은 값타입이 아닌 참조변수이며 문자열을 조합 할 때마다 새로운 클래스가 생성되고 이전의 데이터들은 수집되기 때문에 부하가 발생하지만 StringBuilder은 새로운 변수를 사용하지 않고 결합할 수 있게 된다.

따라서 이 코드는 StringBuilder을 사용하여 출력을 하면 정상적으로 올바르게 나오게 된다.


  • 코드 1
namespace YONGYONG2
{
    internal class Program
    {

        static void Main(string[] args)
        {

            Stack<int> stack = new Stack<int>();
            StringBuilder sb = new StringBuilder();
            int N=int.Parse(Console.ReadLine()); 
            for(int i = 0; i < N; i++)
            {
                string[] input = Console.ReadLine().Split();
                if (input[0]=="push")
                {
                    stack.Push(int.Parse(input[1]));
                }
                else if (input[0] == "pop")
                {
                    if(stack.Count==0)
                    {
                        sb.AppendLine("-1");
                    }
                    else
                    {
                        sb.Append(stack.Pop()+"\n");
                    }
                }
                else if (input[0] == "size")
                {
                    sb.Append(stack.Count()+"\n");
                }
                else if (input[0] == "empty")
                {
                    if(stack.Count()==0)
                    {
                        sb.AppendLine("1");
                    }
                    else
                    {
                        sb.AppendLine("0");
                    }
                }
                else
                {
                    if (stack.Count() == 0)
                    {
                        sb.AppendLine("-1");
                    }
                    else
                    {
                        sb.Append(stack.Peek()+"\n");
                    }
                }
                
            }
            Console.WriteLine(sb.ToString());
        }
    }
}

  • 후기

시간 초과가 떠서 당황했는데 StringBuilder에 대해 알게 되었다.

 

LIST

'백준 > C#' 카테고리의 다른 글

[C#]백준 10773번: 제로  (0) 2023.01.05
[C#]백준 2775번: 부녀회장이 될테야  (0) 2023.01.05
[C#]5597번: 과제 안 내신 분..?  (0) 2023.01.05
[C#]1110번: 더하기 사이클  (0) 2023.01.05
[C#]백준 2442번: 별 찍기 - 5  (0) 2023.01.05

+ Recent posts