[백준 19572] 가뭄 (Small) (C#, C++) - soo:bak
작성일 :
문제 링크
설명
세 구역의 필요 강수량이 주어지는 상황에서, 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;
}