이 문제는 0이 입력될 때마다 가장 최근에 입력된 수를 제거하는 형식입니다. 또한 0이 연속적으로 들어올 수 도 있습니다.
이는 스택을 사용하면 간단하게 해결할 수 있다. 스택은 후입선출(LIFO, Last-In-First-Out) 원칙에 따라 데이터를 저장하고 접근하는 자료구조이다.
스택은 주로 다음과 같은 기능을 가집니다
push: 스택의 맨 위에 데이터를 추가합니다.
pop: 스택의 맨 위에 있는 데이터를 제거하고 반환합니다.
top (또는 peek): 스택의 맨 위에 있는 데이터를 반환하지만, 제거하지는 않습니다.
empty: 스택이 비어있는지 여부를 확인합니다.
size: 스택에 저장된 데이터의 개수를 반환합니다.
코드는 간단하게 설명됩니다.
1. 주어진 코드는 입력된 수를 처리하면서 0이 아닌 수는 스택에 추가하고, 0이 입력되면 스택에서 가장 최근에 입력된 수를 제거합니다. 2. 모든 입력을 처리한 후에는 스택에 남아있는 수들의 합을 계산하여 출력합니다.
문제코드
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int n, a, sum = 0;
stack<int> numStack;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a;
if (a != 0)
numStack.push(a); // 0이 아닌 수는 스택에 추가
else if (!numStack.empty())
numStack.pop(); // 0이 입력되면 스택의 가장 위에 있는 수를 제거
}
// 스택에 남아있는 수들의 합 계산
while (!numStack.empty()) {
sum += numStack.top();
numStack.pop();
}
cout << sum << "\n";
}