[백준 10773] 제로 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
이 문제는 잘못 입력된 숫자를 스택을 이용해 제거하면서 최종 합계를 구하는 문제입니다.
문제 이해
- 정수 
K가 주어지며, 이후K개의 정수가 입력됩니다. - 입력된 정수가 
0이면 가장 최근에 입력된 수를 제거합니다. 0이 아닌 정수는 스택에 추가합니다.- 모든 입력이 끝난 후, 스택에 남아있는 숫자들의 합을 구해야 합니다.
 
접근법
- 스택(Stack) 자료구조를 사용하여 숫자를 저장합니다.
 0이 입력되면 스택에서 최근 숫자를 제거합니다.- 모든 입력이 끝난 후, 스택에 남아있는 숫자들을 합산합니다.
 
예제 시뮬레이션
입력:
1
2
3
4
5
4
3
0
4
0
과정:
3→ 스택:[3]0→ 스택:[](최근 수3제거)4→ 스택:[4]0→ 스택:[](최근 수4제거)
최종 합계는 0입니다.
Code
[ C# ] 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace Solution {
  class Program {
    static void Main(string[] args) {
      var t = int.Parse(Console.ReadLine()!);
      var stack = new Stack<int>();
      for (int i = 0; i < t; i++) {
        int input = int.Parse(Console.ReadLine()!);
        if (input == 0) stack.Pop();
        else stack.Push(input);
      }
      Console.WriteLine(stack.Sum());
    }
  }
}
[ C++ ] 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef stack<int> sti;
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t; cin >> t;
  sti num;
  while (t--) {
    int input; cin >> input;
    if (input == 0) num.pop();
    else num.push(input);
  }
  ll sum = 0;
  while (!num.empty()) {
    sum += num.top();
    num.pop();
  }
  cout << sum << '\n';
  return 0;
}