작성일 :

문제 링크

31312번 - Water Journal

설명

기록된 n-1개의 값과 전체 최소값 a, 최대값 b가 주어질 때, 누락된 하루의 가능한 물 섭취량을 모두 출력하는 문제입니다.


접근법

기록된 값들에 최소값과 최대값이 있는지 확인합니다. 둘 다 존재하면 누락 값은 최소값부터 최대값 사이 어떤 값이든 가능합니다.

최소값만 없으면 누락 값은 최소값이어야 하고, 최대값만 없으면 최대값이어야 합니다. 둘 다 없으면 불가능이므로 -1을 출력합니다.


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
27
28
29
using System;
using System.Collections.Generic;

class Program {
  static void Main() {
    var first = Console.ReadLine()!.Split();
    var n = int.Parse(first[0]);
    var a = int.Parse(first[1]);
    var b = int.Parse(first[2]);

    var hasA = false;
    var hasB = false;
    for (var i = 0; i < n - 1; i++) {
      var w = int.Parse(Console.ReadLine()!);
      if (w == a) hasA = true;
      if (w == b) hasB = true;
    }

    var res = new List<int>();
    if (hasA && hasB) {
      for (var v = a; v <= b; v++)
        res.Add(v);
    } else if (!hasA && hasB) res.Add(a);
    else if (hasA && !hasB) res.Add(b);

    if (res.Count == 0) Console.WriteLine(-1);
    else Console.WriteLine(string.Join(" ", res));
  }
}

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
30
31
32
33
34
35
#include <bits/stdc++.h>
using namespace std;

typedef vector<int> vi;

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

  int n, a, b; cin >> n >> a >> b;
  bool hasA = false, hasB = false;
  for (int i = 0; i < n - 1; i++) {
    int w; cin >> w;
    if (w == a) hasA = true;
    if (w == b) hasB = true;
  }

  vi res;
  if (hasA && hasB) {
    for (int v = a; v <= b; v++)
      res.push_back(v);
  } else if (!hasA && hasB) res.push_back(a);
  else if (hasA && !hasB) res.push_back(b);

  if (res.empty()) cout << -1 << "\n";
  else {
    for (int i = 0; i < (int)res.size(); i++) {
      if (i) cout << " ";
      cout << res[i];
    }
    cout << "\n";
  }

  return 0;
}