[Easy] 976. Largest Perimeter Triangle

문제

Given an integer array nums, return the largest perimeter of a triangle with a non-zero area, formed from three of these lengths. If it is impossible to form any triangle of a non-zero area, return 0.

 

nums 배열이 들어오면, 그 중 세 개의 요소로 이루어진 삼각형의 가장 큰 둘레를 반환한다.

삼각형을 만드는 것이 불가능하면 0을 반환한다.

 

예시

Example 1:

Input: nums = [2,1,2]
Output: 5

Example 2:

Input: nums = [1,2,1]
Output: 0

 

제약조건

Constraints:

  • 3 <= nums.length <= 104
  • 1 <= nums[i] <= 106

 

해결 과정

처음에는 nums 배열 요소가 3개 들어온다고 가정을 하고 문제를 풀었는데, 더 많은 요소가 들어오는 것을 파악하고 코드를 다르게 하여 해결하였다.

  • 우선 nums 배열을 내림차순으로 정리한다.
  • 길이의 순서에 따라 변의 길이를 할당할 n1, n2, n3 를 초기화한다. 
  • for문을 돌면서 삼각형의 조건을 만족하는지 확인한다.
    • 세 변의 길이를 알고 있을 때 삼각형이 되는 조건은 가장 긴 변의 길이가 두 변의 길이보다 작아야 한다.
    • 이 조건을 만족시킨다면 n1, n2, n3에 값을 할당하고 for문을 빠져나온다.
    • 조건을 만족시키지 못했다면 n1, n2, n3에는 처음에 할당했던 0이 담겨져있다.
  • for문을 나온 후 n1 + n2 + n3 한 값을 반환한다.

해결 코드

/**
 * @param {number[]} nums
 * @return {number}
 */
var largestPerimeter = function(nums) {
    
    // 가장 긴 변의 길이는 두 변의 합보다 작아야 함
    nums.sort((a, b) => b- a);
    console.log(nums)
    
    let n1 = 0,
        n2 = 0,
        n3 = 0;
    
    for(let i = 0 ; i < nums.length - 2 ; i++){
        if(nums[i] < nums[i + 1] + nums[i + 2]){
            n1 = nums[i];
            n2 = nums[i + 1];
            n3 = nums[i + 2];
            break;
        }        
    }
    
    return n1 + n2 + n3;
};