백준 문제

백준 1448(삼각형 만들기) c++

kangyuseok 2021. 9. 11. 15:43
728x90

문제

 

1448번: 삼각형 만들기

첫째 줄에 빨대의 개수 N이 주어진다. N은 3보다 크거나 같고, 1,000,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 빨대의 길이가 한 줄에 하나씩 주어진다. 빨대의 길이는 1,000,000보다

www.acmicpc.net

숫자를 입력받아 삼각형을 만들 수 있으면 그중 가장큰 삼각형 세변의 길이를 출력하고 삼각형을 만들 수 없으면

-1을 출력하는 문제입니다.

삼각형이 이루어질 수 있는 조건은 세변중 가장큰변이 나머지 두변의 합보다 작으면 가능합니다.

코드를 보겠습니다.

int n;
cin >> n;

vector<int>v(n);
for (int i = 0; i < n; i++) {
	cin >> v[i];
}

먼저 변의 개수를 받아줄 n을 입력받고 벡터v에 넣어줍니다.

sort(v.begin(), v.end(),cmp);
bool find = false;
for (int i = 0; i < n - 2; i++) {
	if (v[i] < (v[i + 1] + v[i + 2])) {
		cout << v[i] + v[i + 1] + v[i + 2];
		find = true;
		break;
	}
}
if (!find)
	cout << -1;
    
bool cmp(int a, int b) {
	return a > b;
}

모든 변을 입력받은 벡터를 내림차순으로 정렬해줍니다.

sort함수는 기본적으로 오름차순으로 정렬해줌으로 boolen형 함수로 내림차순으로 정렬하게끔 만들어줍니다.

가장 큰 길이의 삼각형을 만들어야 하기 때문에 벡터의 앞에서부터 확인하기 위함입니다.

그다음 boolen형 변수 find를 false로 초기화 해줍니다. 

삼각형이 제대로 만들어졌으면 find를 true로 바꾸고 그 값을 출력해주지만 만약 삼각형을 만들 수 없으면 find는 그대로

false이므로 -1을 출력하게 됩니다.

for문을 통해 i=0부터 n-3까지 반복을 하는데 v[i](삼각형중 가장큰변) <v[i+1](두번째 큰변)+v[i+2](세번째 큰변)

을 만족하면 삼각형이 형성되므로 find 를true로 바꿔주고 세변의 합을 출력해주고 break함수로 탈출하게 됩니다.


전체 코드입니다.

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(int a, int b);
int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
	int n;
	cin >> n;

	vector<int>v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	sort(v.begin(), v.end(),cmp);
	bool find = false;
	for (int i = 0; i < n - 2; i++) {
		if (v[i] < (v[i + 1] + v[i + 2])) {
			cout << v[i] + v[i + 1] + v[i + 2];
			find = true;
			break;
		}
	}
	if (!find)
		cout << -1;
	
	
	return 0;
}
bool cmp(int a, int b) {
	return a > b;
}