[LeetCode] 1726. Tuple with Same Product (Python)

2025. 2. 7. 01:16·코딩 테스트
728x90

Problem

 

Solution

permutation

순열과 조합을 사용하여 푸는 문제.

defaultdict 의 value를 리스트로 선언하여 2개의 integer 곱을 key로, tuple 을 value로 저장하였다.

value 길이 (리스트)가 2 이상이면 value 길이만큼 8 x nC2 를 곱하여 경우의 수를 구하고 정답에 ++ 하였다.

8을 곱하는 이유는 a*b = c*d 인 (a,b,c,d)의 경우의 수가 8이기 때문! ( 4permutation * 2 pairs)

nC2를 한 이유는 value 길이 = n 에서 2개의 튜플을 선택해야되기 때문!

 

Code

from collections import defaultdict

class Solution:
    def tupleSameProduct(self, nums: List[int]) -> int:
        def factorial(x):
            res = 1
            for i in range(2, x+1):
                res = res * i
            return res
        
        def combination(n, r):
            return factorial(n) // (factorial(r) * factorial(n-r))
            
        map = defaultdict(list)

        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                multiple = nums[i] * nums[j]
                map[multiple].append((nums[i], nums[j]))
        
        cnt = 0
        for k, v in map.items():
            if len(v) >= 2:
                cnt += 8 * combination(len(v), 2)
    
        return cnt

 

Complexity

Time Complexity

  • 2중 for문을 순회하므로 O(n^2)

 

Space Complexity

 

  • map은 최대 O(N²) 크기의 리스트를 가질 수 있음.
  • 최악의 경우, 모든 숫자의 곱이 다 다르면 map의 크기는 O(N²).
  • 모든 숫자의 곱이 같은 경우 map에 O(N²)개의 값이 저장될 수 있음.

 

다른 풀이

  • value에 굳이 튜플을 저장하지 않고 중복된 값 개수만 n++
  • nC2 * 8 을 해준다. 이때 n=1이면 스킵.
  • combination은 math.comb 메서드 사용
  • 시간복잡도: O(N^2)
  • 공간복잡도: O(N^2) -> dictionary 사용
def tupleSameProduct(self, nums: List[int]) -> int:
        counts = defaultdict(int)
        n = len(nums)

        for i in range(n):
            for j in range(i + 1, n):
                counts[nums[i] * nums[j]] += 1

        ans = 0

        for v in counts:
            count = counts[v]
            if count > 1:
                ans += count * (count - 1) // 2 * 8  # 조합 계산 최적화 (math.comb 대신 사용)
                또는
            	ans += math.comb(count, 2) * 8
        
        return ans

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'코딩 테스트' 카테고리의 다른 글

[LeetCode] 2349. Design a Number Container System (Python)  (0) 2025.02.08
[LeetCode] 3160. Find the Number of Distinct Colors Among the Balls (Python)  (0) 2025.02.08
[LeetCode] 1800. Maximum Ascending Subarray Sum (Python)  (0) 2025.02.04
[LeetCode] 3105. Longest Strictly Increasing or Strictly Decreasing Subarray (Python)  (0) 2025.02.03
[LeetCode] 1752. Check if Array Is Sorted and Rotated (Python)  (0) 2025.02.02
'코딩 테스트' 카테고리의 다른 글
  • [LeetCode] 2349. Design a Number Container System (Python)
  • [LeetCode] 3160. Find the Number of Distinct Colors Among the Balls (Python)
  • [LeetCode] 1800. Maximum Ascending Subarray Sum (Python)
  • [LeetCode] 3105. Longest Strictly Increasing or Strictly Decreasing Subarray (Python)
zoodi
zoodi
IT/개발 관련 지식을 기록하는 블로그입니다.
  • zoodi
    오늘의 기록
    zoodi
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 후기
        • 컨퍼런스
        • 일상리뷰
      • 금융경제
        • 뉴스
        • 금융IT용어
        • 경제 및 부동산
      • 코딩 테스트
      • 스터디
        • JAVA
        • Kotlin
        • Spring
        • React, Nextjs
        • 인공지능 AI
        • Cloud & k8s
        • Kafka
        • Database
        • Network
        • Algorithm
        • Hadoop
        • LINUX
        • R Programming
        • 기타 (소공, 보안)
      • 도서
      • 기타
  • 블로그 메뉴

    • 홈
    • 스터디
    • 금융경제
    • 후기
    • 기타
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pythoncodingtest
    CodingTest
    Spring
    스프링
    LeetCode
    codility
    알고리즘
    springboot
    금융용어
    코딜리티
    코테
    Kotlin
    코딩테스트
    코테공부
    MySQL
    kafka
    프로그래머스
    C++
    리트코드
    쿠버네티스
    자바
    java
    스프링부트
    자료구조
    db
    카카오코테
    네트워크
    Python
    코딩
    이분탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
zoodi
[LeetCode] 1726. Tuple with Same Product (Python)
상단으로

티스토리툴바