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 |