백준 문제
백준 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;
}