작성일 :

문제 링크

19572번 - 가뭄 (Small)

설명

세 구역의 필요 강수량이 주어지는 상황에서, d₁, d₂, d₃ (1 ≤ dᵢ ≤ 10⁶)가 주어질 때, 비를 내리는 세 가지 방법으로 각 구역의 필요량을 정확히 만족시킬 수 있는지 판단하는 문제입니다.

비를 내리는 방법은 세 가지입니다:

  • 1번과 2번 구역에 동시에 a만큼
  • 1번과 3번 구역에 동시에 b만큼
  • 2번과 3번 구역에 동시에 c만큼

각 구역이 받는 총 강수량은 다음과 같습니다:

  • 1번 구역: a + b = d₁
  • 2번 구역: a + c = d₂
  • 3번 구역: b + c = d₃

이 세 식을 연립하면 a, b, c를 구할 수 있습니다. a, b, c가 모두 양수이면 가능하며 1과 함께 값들을 출력하고, 하나라도 0 이하이면 불가능하므로 -1을 출력합니다.


접근법

연립방정식을 풀어 a, b, c를 계산한 후, 모두 양수인지 확인합니다.


먼저 세 방정식을 정리합니다:

  • d₁ = a + b
  • d₂ = a + c
  • d₃ = b + c

이 세 식을 연립하여 a, b, c를 구합니다. 첫 번째와 두 번째 식을 더하면 d₁ + d₂ = 2a + b + c가 됩니다. 여기서 세 번째 식 d₃ = b + c를 빼면 d₁ + d₂ - d₃ = 2a이므로 a = (d₁ + d₂ - d₃) / 2입니다.

이후, 같은 방식으로 b와 c를 구합니다. b = (d₁ - d₂ + d₃) / 2, c = (d₂ - d₁ + d₃) / 2입니다.

계산된 a, b, c 중 하나라도 0 이하이면 불가능하므로 -1을 출력합니다. 세 값이 모두 양수이면 1을 출력하고, 그 다음 줄에 a, b, c를 소수점 첫째 자리까지 출력합니다.


예를 들어, d₁ = 6, d₂ = 8, d₃ = 10인 경우:

a = (6 + 8 - 10) / 2 = 2, b = (6 - 8 + 10) / 2 = 4, c = (8 - 6 + 10) / 2 = 6이 됩니다. 모두 양수이므로 1을 출력하고 “2.0 4.0 6.0”을 출력합니다.

반면 d₁ = 1, d₂ = 2, d₃ = 10인 경우, a = (1 + 2 - 10) / 2 = -3.5로 음수가 나오므로 -1을 출력합니다.


단순 계산과 조건 확인만으로 해결되므로 시간 복잡도는 O(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
using System;

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var parts = Console.ReadLine()!.Split();
      var d1 = double.Parse(parts[0]);
      var d2 = double.Parse(parts[1]);
      var d3 = double.Parse(parts[2]);

      var a = (d1 + d2 - d3) / 2.0;
      var b = (d1 - d2 + d3) / 2.0;
      var c = (d2 - d1 + d3) / 2.0;

      if (a <= 0 || b <= 0 || c <= 0) {
        Console.WriteLine(-1);
      } else {
        Console.WriteLine(1);
        Console.WriteLine($"{a:F1} {b:F1} {c:F1}");
      }
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <bits/stdc++.h>
using namespace std;

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

  double d1, d2, d3; cin >> d1 >> d2 >> d3;

  double a = (d1 + d2 - d3) / 2.0;
  double b = (d1 - d2 + d3) / 2.0;
  double c = (d2 - d1 + d3) / 2.0;

  if (a <= 0 || b <= 0 || c <= 0)
    cout << -1 << "\n";
  else {
    cout << 1 << "\n";
    cout << fixed << setprecision(1);
    cout << a << " " << b << " " << c << "\n";
  }

  return 0;
}