728x90
문제
https://www.acmicpc.net/problem/10828
그냥 스택의 기능을 공부한다 생각하고 풀면 되는 문제다.
코드
using System;
using System.Text;
using System.Collections.Generic;
namespace baejoon
{
class Algorithm
{
static void Main(string[] str)
{
// parse -> convert로 변경
int cnt = Convert.ToInt32(Console.ReadLine());
Stack<string> stack = new Stack<string>();
// 런타임 에러를 방지를 위해 사용
StringBuilder sb = new StringBuilder();
for(int i = 0; i < cnt; i++)
{
string[] s = Console.ReadLine().Split(' ');
switch(s[0])
{
case "push":
stack.Push(s[1]);
break;
case "pop":
sb.AppendLine(stack.Count >= 1 ? stack.Pop().ToString() : "-1");
break;
case "top":
sb.AppendLine(stack.Count >=1 ? stack.Peek().ToString() : "-1");
break;
case "size":
sb.AppendLine(stack.Count().ToString());
break;
case "empty":
sb.AppendLine(stack.Count == 0 ? "1" : "0");
break;
}
}
Console.WriteLine(sb);
}
}
}
고민
컴파일 에러와 런타임 에러들이 보이는가... 정말 고난의 연속이었다.
1. warning CS8604: Possible null reference argument for parameter 's' in 'int int.Parse(string s)'.
int cnt = int.Parse(Console.ReadLine()); // 기존
int cnt = Convert.ToInt32(Console.ReadLine()); // 변경
2. warning CS8602: Dereference of a possibly null reference.
string[] s = Console.ReadLine().Split(" "); // 기존
string[] s = Console.ReadLine().Split(' '); // 변경
사실 이건.. 대체 무슨 차이인지 모르겠다. " "에서 ' '로 변경했더니 컴파일 에러가 사라졌다...
// 런타임 에러를 방지를 위해 사용
StringBuilder sb = new StringBuilder();
...
sb.AppendLine(stack.Count == 0 ? "1" : "0");
...
Console.WriteLine(sb);
// 이전
switch(s[0])
{
case "push":
stack.Push(s[1]);
break;
case "pop":
sb.AppendLine(stack.Pop());
break;
case "top":
if(stack.Count <= 0) { sb.AppendLine("-1"); }
else { sb.AppendLine(stack.Peek()); }
break;
case "size":
sb.AppendLine(stack.Count());
break;
case "empty":
if(stack.Count <= 0) { sb.AppendLine("1"); }
else { sb.AppendLine("0"); }
break;
}
// 이후
switch(s[0])
{
case "push":
stack.Push(s[1]);
break;
case "pop":
sb.AppendLine(stack.Count >= 1 ? stack.Pop().ToString() : "-1");
break;
case "top":
sb.AppendLine(stack.Count >=1 ? stack.Peek().ToString() : "-1");
break;
case "size":
sb.AppendLine(stack.Count().ToString());
break;
case "empty":
sb.AppendLine(stack.Count == 0 ? "1" : "0");
break;
}
런타임 에러가 너무 슬펐다. 뭐가 문제였는지 몰랐는데, 찾아보니 StringBuilder라는 객체를 생성하여 AppendLine으로 한줄씩 추가하고 Console.WriteLIne(sb); 이런 형식으로 출력을 많이 하는 거 같았다.
그리고 if, else를 남발하지 말고 조건연산자를 사용해서 나타내었더니 런타임 에러가 사라졌다...
코딩테스트를 공부하다보니 이런저런 것들을 알게되어서 좋다. 앞으로는 이런 실수를 하지 않겠다!
'동식이 취업시키기 작전 > 코딩테스트' 카테고리의 다른 글
[백준] 10845 큐(c#) (1) | 2024.01.22 |
---|---|
[백준] 카드2 2164(c#) (1) | 2024.01.22 |
[백준] 제로 10773(c#) (0) | 2024.01.22 |
[백준] 9012번 괄호(c#) (1) | 2024.01.21 |
[백준] 으로 코딩테스트 대비하기(feat. 애인) (1) | 2024.01.21 |