정신과 시간의 방
카테고리
작성일
2024. 8. 15. 23:45
작성자
risehyun
  • 문제

 

  • 풀이
#include <iostream>

using namespace std;

int main()
{
	int input[3] = { 0 };
	int result = 0;

	// 입력
	for (int i = 0; i < 3; i++)
	{
		cin >> input[i];
	}

	// 정렬
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			if (input[j] > input[j + 1])
			{
				int temp = input[j];
				input[j] = input[j + 1];
				input[j + 1] = temp;
			}
		}
	}

	int sum = input[0] + input[1];
	int max = input[2];

	if (sum <= max)
	{
		// 삼각형이 형성 되기 위한 조건 미충족
		// 따라서 max값 대신 sum - 1을 해준 값을 사용한다.
		result = (sum * 2) - 1;
	}
	else
	{
		result = sum + max;
	}

	cout << result;
	

	return 0;
}

 

  • 메모
    삼각형의 전제 조건이 되는, 각 변의 길이를 비교한 기본 성질을 이용한 문제다.
    변의 길이를 따졌을 때 가장 긴 변의 길이가 나머지 두 변의 길이를 더한 값보다 같거나 작아야 한다.

    따라서 이번 문제에서는

    1. 삼각형의 기본 성질을 미충족 한 경우
    2. 충족한 경우

    이렇게 2가지 경우의 수에 맞춰 결과를 출력해야 한다.

    문제에 따르면 막대의 길이를 연장하는 것은 불가능하지만 줄이는 것에는 제한이 없다.
    따라서 우선 입력받은 값을 오름차순으로 정렬해서 가장 긴 변과 나머지 변이 구별되도록 만든다.
    정렬 후에는 가장 긴 변이 input [2]에 입력된다. 

    이 값들을 사용해서 먼저 비교값이 될 input[0] + input [1]의 값을 변수 sum에 저장해 주고,
    가장 긴 변 input [2]를 max 변수에 할당해 준다.

    만약 1번에 해당하는 경우 max값이 sum의 값보다 작거나 같게 만들어 주기만 하면 되기 때문에
    (sum * 2)를 한 값에 -1을 해주면 조건에 맞는 결과값이 도출된다.

    반대로 2에 해당하는 경우 추가적인 연산이 필요하지 않기 때문에 바로 sum + max를 한 둘레를 그대로 출력했다.