영선이는 길이가 a, b, c인 세 막대를 가지고 있고, 각 막대의 길이를 마음대로 줄일 수 있다.
영선이는 세 막대를 이용해서 아래 조건을 만족하는 삼각형을 만들려고 한다.
각 막대의 길이는 양의 정수이다
세 막대를 이용해서 넓이가 양수인 삼각형을 만들 수 있어야 한다.
삼각형의 둘레를 최대로 해야 한다.
a, b, c가 주어졌을 때, 만들 수 있는 가장 큰 둘레를 구하는 프로그램을 작성하시오.
첫째 줄에 a, b, c (1 ≤ a, b, c ≤ 100)가 주어진다.
첫째 줄에 만들 수 있는 가장 큰 삼각형의 둘레를 출력한다.
주어진 막대 길이로 삼각형이 안되는 경우를 조건문을 통해 구현하고,
주어진 막대 길이로 삼각형이 되는 경우는 이미 최대의 둘레이므로 그대로 출력한다.
내장함수를 쓰기 귀찮아서 a,b,c 대소 비교를 따로 하지 않고 모든 경우의 수를 고려하였다.
#include <iostream>
using namespace std;
int main()
{
int a,b,c,tot=0;
cin >> a >> b >> c;
if (a >= b+c) // a가 제일 커서 삼각형이 안되는 경우
if (tot < 2*(b+c)-1) tot = 2*(b+c)-1;
if (b >= a+c)
if (tot < 2*(a+c)-1) tot = 2*(a+c)-1;
if (c >= a+b)
if (tot < 2*(a+b)-1) tot = 2*(a+b)-1;
cout << (tot?tot:a+b+c);
}
위의 로직을 max 함수와 삼항연산자를 활용하여 훨씬 압축적으로 구현하였다.
#import<iostream>
#import<cmath>
main(){
int a,b,c;
std::cin>>a>>b>>c;
std::cout<<(std::max({a,b,c})*2>=a+b+c?2*(a+b+c-std::max({a,b,c}))-1:a+b+c);}
이런 좋은 글을 작성해주셔서 감사합니다.