작성일 :

문제 링크

21280번 - Confused Lecturer

설명

첫 주를 제외하면 교수는 항상 직전 주와 동일한 강의 수만 있다고 생각합니다. 각 주의 실제 강의 수가 주어질 때, 빈 강의실에서 강의한 횟수와 결강한 횟수를 합산해 출력하는 문제입니다.


접근법

교수는 항상 직전 주의 강의 수만큼 강의가 있다고 생각합니다. 실제 강의 수가 더 적으면 그 차이만큼 빈 강의실에서 강의하게 되고, 실제 강의 수가 더 많으면 그 차이만큼 결강하게 됩니다.

각 주마다 직전 주와 현재 주의 강의 수를 비교하여 차이를 누적하면 됩니다.


Code

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
using System;
using System.Collections.Generic;
using System.Linq;

class Program {
  static void Main() {
    var n = int.Parse(Console.ReadLine()!);
    var vals = new List<int>();
    while (vals.Count < n) {
      var line = Console.ReadLine();
      if (string.IsNullOrWhiteSpace(line)) continue;
      vals.AddRange(line.Split().Select(int.Parse));
    }

    var empty = 0;
    var missed = 0;
    for (var i = 1; i < n; i++) {
      var prev = vals[i - 1];
      var cur = vals[i];
      if (prev > cur) empty += prev - cur;
      else if (cur > prev) missed += cur - prev;
    }

    Console.WriteLine($"{empty} {missed}");
  }
}

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
#include <bits/stdc++.h>
using namespace std;

typedef vector<int> vi;

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

  int n; cin >> n;
  vi a(n);
  for (int i = 0; i < n; i++)
    cin >> a[i];

  int empty = 0, missed = 0;
  for (int i = 1; i < n; i++) {
    int prev = a[i - 1], cur = a[i];
    if (prev > cur) empty += prev - cur;
    else if (cur > prev) missed += cur - prev;
  }

  cout << empty << " " << missed << "\n";

  return 0;
}