알고리즘

[BOJ 1448] 삼각형 만들기

dldyou 2024. 3. 28. 13:00

$N$개의 길이 중 3개를 선택하여 삼각형을 만들었을 때, 세 변의 길이의 합의 최댓값을 구하는 문제이다. 

 

그리디하게 접근해 보자. 세 변의 길이의 합을 최대로 만들려면 당연히 길이들 중 최대한 긴 것을 선택해야 한다. 그렇다면 정렬을 먼저 해보자. 

 

가장 큰 3개를 봤을 때, 삼각형이 안 되면 어떤 길이를 선택해야 할까?

 

XXXXXXXOOO에서 XXXXXXOXOO 이런 식으로 선택을 해야 할까? 

 

삼각형을 이루는 세 변의 길이의 조건을 생각해 보자.

'가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 한다.'

 

가장 긴 3개를 골랐을 때, 삼각형이 안 된다면 가장 긴 길이를 유지한 채로 다른 변을 더 짧은 길이를 선택하는 것은 삼각형에서 멀어지는 길이다. 위의 상황과 같이 가장 긴 길이를 기준으로 바로 다음 2개의 변으로 삼각형을 만들지 못한다면, 해당하는 가장 긴 길이의 변으로는 삼각형을 만들지 못한다.

 

즉, 연속되는 3개의 변만 차례로 확인하면 된다.

int N; 
vector<int> v;

int main(void) {
    fastio;
    cin >> N;
    for (int i = 0; i < N; i++) {
        int x; cin >> x;
        v.push_back(x);        
    }
    sort(all(v), greater<int>());

    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] << "\n";
            return 0;
        }
    }
    cout << "-1\n";
    return 0;
}

 

'알고리즘' 카테고리의 다른 글

[BOJ 2056] 작업  (0) 2024.03.29
[BOJ 2992] 크면서 작은 수  (0) 2024.03.29
[BOJ 3673] 나눌 수 있는 부분 수열  (0) 2024.03.28
[BOJ 20310] 타노스  (0) 2024.03.26
[BOJ 4900] 7 더하기  (0) 2024.03.26