작성일 :

문제 링크

24609번 - Overdraft

설명

문제의 목표는 은행 거래 내역을 바탕으로 ‘Overdraft 수수료를 피하기 위해 필요한 최소 시작 잔액 을 계산하는 것입니다.

입력으로 주어지는 거래의 횟수만큼, 각 거래를 순회하며 현재 잔액최소 잔액 을 거래에 반영합니다.

입금은 잔액을 증가시키고, 출금은 잔액을 감소시킵니다.

이 때, 각 거래 후 현재 잔액이 이전의 최소 잔액보다 낮은 경우에 최소 잔액을 갱신합니다.

모든 거래에 대해 처리를 완료한 후, 최소 잔액이 음수라면, 이 값의 절대값이 ‘Overdraft’ 수수료를 피하기 위해 필요한 최소금액이 됩니다.

최소 잔액이 0 이상인 경우, ‘Overdraft’ 수수료를 피하기 위해 추가로 필요한 시작 잔액은 없으므로, 0 을 출력합니다.



Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace Solution {
  class Program {
    static void Main(string[] args) {

      var n = int.Parse(Console.ReadLine()!);

      var transactions = new int[n];
      for (int i = 0; i < n; i++)
        transactions[i] = int.Parse(Console.ReadLine()!);

      var result = transactions
        .Aggregate((CurrentBalance: 0, MinBalance: 0), (acc, transaction) => {
          var currentBalance = acc.CurrentBalance + transaction;
          var minBalance = Math.Min(acc.MinBalance, currentBalance);
          return (currentBalance, minBalance);
        });

      Console.WriteLine(result.MinBalance < 0 ? - result.MinBalance : 0);

    }
  }
}



[ 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
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;

  vector<int> transactions(n);
  for (int i = 0; i < n; i++)
    cin >> transactions[i];

  int currentbalance = 0, minBalance = 0;
  for (int i = 0; i < n; i++) {
    currentbalance += transactions[i];
    minBalance = min(minBalance, currentbalance);
  }

  cout << (minBalance < 0 ? -minBalance : 0) << "\n";

  return 0;
}