ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 - 리스트 내 n개 값 추출
    문제풀이/PYTHON 2024. 4. 26. 20:10

    nCk

    from itertools import combinations
    
    def find_zero_sum_triplets(numbers):
        count = 0
        # 리스트 내에서 3개의 값을 선택하는 모든 조합을 생성
        for triplet in combinations(numbers, 3):
            # 선택된 3개의 값의 합이 0이면 count를 증가
            if sum(triplet) == 0:
                count += 1
        return count
    
    # 예제 사용
    numbers = [3, 2, 0, -5, 1, -1, 4, -2, 6]
    result = find_zero_sum_triplets(numbers)
    print("Zero sum triplets count:", result)

    확통의 그것 / 집합을 사용할 줄 알았으나 리스트에 적용 됨

     

     

     

     

    def find_zero_sum_triplets(numbers):
        numbers.sort()  # 리스트를 정렬합니다.
        count = 0
        n = len(numbers)
    
        for i in range(n - 2):  # 마지막 세 개의 요소는 고려하지 않습니다.
            left = i + 1
            right = n - 1
    
            while left < right:
                total = numbers[i] + numbers[left] + numbers[right]
                if total == 0:
                    count += 1
                    left += 1
                    right -= 1
                elif total < 0:
                    left += 1
                else:
                    right -= 1
    
        return count
    
    # 예제 사용
    numbers = [3, 2, 0, -5, 1, -1, 4, -2, 6]
    result = find_zero_sum_triplets(numbers)
    print("Zero sum triplets count:", result)

     

     

    from collections import defaultdict
    
    def find_zero_sum_triplets(numbers):
        # 합이 0이 되는 두 수의 합과 위치를 저장하는 해시맵
        sum_map = defaultdict(list)
        n = len(numbers)
        count = 0
    
        # 모든 가능한 두 수의 합과 위치를 해시맵에 저장
        for i in range(n):
            for j in range(i + 1, n):
                sum_val = numbers[i] + numbers[j]
                sum_map[sum_val].append((i, j))
    
        # 남은 한 수를 해시맵에서 찾아서 합이 0이 되는 경우를 찾음
        for k in range(n):
            target = -numbers[k]
            if target in sum_map:
                for pair in sum_map[target]:
                    if k != pair[0] and k != pair[1]:  # 같은 위치에 있는 경우 제외
                        count += 1
    
        # 각 경우를 두 번 세었으므로 2로 나누어야 함
        return count // 2
    
    # 예제 사용
    numbers = [3, 2, 0, -5, 1, -1, 4, -2, 6]
    result = find_zero_sum_triplets(numbers)
    print("Zero sum triplets count:", result)

     

     

    def find_zero_sum_triplets(numbers):
        def backtrack(start, target_sum, current_combination):
            if len(current_combination) == 3:
                if sum(current_combination) == 0:
                    nonlocal count
                    count += 1
                return
            for i in range(start, len(numbers)):
                if target_sum + numbers[i] * (3 - len(current_combination)) > 0:
                    break
                current_combination.append(numbers[i])
                backtrack(i + 1, target_sum + numbers[i], current_combination)
                current_combination.pop()
    
        count = 0
        numbers.sort()
        backtrack(0, 0, [])
        return count
    
    # 예제 사용
    numbers = [3, 2, 0, -5, 1, -1, 4, -2, 6]
    result = find_zero_sum_triplets(numbers)
    print("Zero sum triplets count:", result)

     

     

     

Designed by Tistory.