[백준 20490] Рыцарский щит (C#, C++) - soo:bak
작성일 :
문제 링크
설명
두 삼각형 모양의 방패를 변끼리 맞닿게 붙여 하나의 방패를 만들 때, 가능한 둘레의 최솟값을 구하는 문제입니다.
접근법
두 도형을 붙였을 때 둘레는 원래 두 삼각형의 둘레 합에서, 서로 맞닿아 내부로 들어간 길이의 두 배만큼 줄어듭니다.
따라서 둘레를 최소로 만들려면 두 삼각형이 공유하는 변 길이를 최대화하면 됩니다. 한 삼각형의 변 일부를 다른 삼각형의 변 일부와 맞닿게 둘 수 있으므로, 공유할 수 있는 최대 길이는 두 삼각형의 가장 긴 변 길이 중 더 짧은 값입니다.
결국 정답은 첫 번째 삼각형의 둘레 + 두 번째 삼각형의 둘레 - 2 × min(두 삼각형의 가장 긴 변)입니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Linq;
class Program {
static void Main() {
long[] first = Console.ReadLine()!.Split().Select(long.Parse).ToArray();
long[] second = Console.ReadLine()!.Split().Select(long.Parse).ToArray();
long sum1 = first[0] + first[1] + first[2];
long sum2 = second[0] + second[1] + second[2];
long max1 = Math.Max(first[0], Math.Max(first[1], first[2]));
long max2 = Math.Max(second[0], Math.Max(second[1], second[2]));
long answer = sum1 + sum2 - 2 * Math.Min(max1, max2);
Console.WriteLine(answer);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long a1, b1, c1;
long long a2, b2, c2;
cin >> a1 >> b1 >> c1;
cin >> a2 >> b2 >> c2;
long long sum1 = a1 + b1 + c1;
long long sum2 = a2 + b2 + c2;
long long max1 = max(a1, max(b1, c1));
long long max2 = max(a2, max(b2, c2));
long long answer = sum1 + sum2 - 2 * min(max1, max2);
cout << answer << "\n";
return 0;
}