알고리즘/LeetCode

1534. Count Good Triplets

앤테바 2022. 12. 29. 16:25
반응형

문제)

1534. Count Good Triplets

 

Given an array of integers arr, and three integers a, b and c. You need to find the number of good triplets.

A triplet (arr[i], arr[j], arr[k]) is good if the following conditions are true:

  • 0 <= i < j < k < arr.length
  • |arr[i] - arr[j]| <= a
  • |arr[j] - arr[k]| <= b
  • |arr[i] - arr[k]| <= c

Where |x| denotes the absolute value of x.

Return the number of good triplets.

 

Example 1:

Input: arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3
Output: 4
Explanation: There are 4 good triplets: [(3,0,1), (3,0,1), (3,1,1), (0,1,1)].

Example 2:

Input: arr = [1,1,2,2,3], a = 0, b = 0, c = 1
Output: 0
Explanation: No triplet satisfies all conditions.

 

Constraints:

  • 3 <= arr.length <= 100
  • 0 <= arr[i] <= 1000
  • 0 <= a, b, c <= 1000

솔루션1)

- brute-force로 for 루프 세개로 문제 해결

- 속도를 조금 빠르게 하기 위해서 두 번째 for 문에서 a  값 차이를 먼 확인해서 a 보다 크다면 3번째 for 루프는 skip

class Solution:
    def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
        # brute-force
        
        count = 0
        for i in range(len(arr)-2):
            for j in range(i+1, len(arr)-1):                
                if (abs(arr[i]-arr[j])) > a:
                    continue
                for k in range(j+1, len(arr)):
                    if (abs(arr[j]-arr[k])) <= b and (abs(arr[i]-arr[k])) <= c:
                        count += 1
        return count

솔루션2)

- 조합 함수 combination() 함수를 사용해서 for 문을 대체

- 오히려 솔루션1 보다 결과가 느림. 솔루션1을 두 번째 for 문 단계에서 abs(arr[i]-arr[j])를 계산해서 a보다 큰 경우 3번째 for 문을 계산하지 않기때문에 더 빠름

class Solution:
    def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
        count = 0
        for nums in combinations(arr, 3):
            if abs(nums[0]-nums[1]) <= a and abs(nums[1] - nums[2]) <= b and abs(nums[0] - nums[2]) <= c:
                count += 1
        return count

반응형