
https://www.acmicpc.net/problem/10773
오늘은 백준 10773번 문제인 제로 문제를 풀어봤다.
문제 자체는 간단한 편이었지만, "최근에 쓴 수를 지운다"는 조건 때문에 어떤 방식으로 처리해야 할지 고민이 조금 되었다.
숫자를 하나씩 입력받는다.
0이 입력되면 바로 직전에 입력한 수를 지운다.
모든 입력이 끝난 후, 남아있는 수들의 합을 구한다.
처음에는 "0이 몇 번 나왔는지를 세고, 나중에 그 수만큼 배열에서 제거하면 되지 않을까?" 라고 생각했는데,
그렇게 하면 정확히 어떤 수를 삭제해야 하는지 알 수 없기 때문에 틀린 접근이라는 걸 깨달았다.
즉, 순차적으로 바로바로 처리해야 한다는 점이 중요하다.
이 문제는 "가장 최근 값을 지운다"는 조건이 있기 때문에
스택 (Stack) 을 사용하는 게 딱 적합했다.
스택은 LIFO(Last In First Out) 구조이기 때문에 Push와 Pop을 통해 쉽게 구현할 수 있었다.
using System;
using System.Collections.Generic;
namespace backjoon
{
internal class Program
{
static void Main()
{
int count = int.Parse(Console.ReadLine());
Stack<int> stack = new Stack<int>();
for (int i = 0; i < count; i++)
{
int a = int.Parse(Console.ReadLine());
if (a == 0)
{
stack.Pop();
}
else
{
stack.Push(a);
}
}
int sum = 0;
foreach (int num in stack)
sum += num;
Console.WriteLine(sum);
}
}
}
"최근의 값만 지운다"는 조건은 Stack을 사용하라는 힌트와 같았다.
입력을 순차적으로 처리하는 구조가 필요한 문제였다.
문제를 보고 자료구조가 떠오르게 연습해야겠다.
이 문제를 통해 스택의 기본적인 사용법과 문제를 자료구조로 해결하는 방법을 다시 한 번 복습할 수 있었다.