작성일 :

문제 링크

10773번 - 제로

설명

이 문제는 잘못 입력된 숫자를 스택을 이용해 제거하면서 최종 합계를 구하는 문제입니다.

문제 이해

  1. 정수 K가 주어지며, 이후 K개의 정수가 입력됩니다.
  2. 입력된 정수가 0이면 가장 최근에 입력된 수를 제거합니다.
  3. 0이 아닌 정수는 스택에 추가합니다.
  4. 모든 입력이 끝난 후, 스택에 남아있는 숫자들의 합을 구해야 합니다.

접근법

  • 스택(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;
}