본문 바로가기

Algorithm/Implementation

(Python3) - LeetCode (Medium) : 3867. Sum of GCD of Formed Pairs

반응형

https://leetcode.com/problems/sum-of-gcd-of-formed-pairs

 

Sum of GCD of Formed Pairs - LeetCode

Can you solve this real interview question? Sum of GCD of Formed Pairs - You are given an integer array nums of length n. Construct an array prefixGcd where for each index i: * Let mxi = max(nums[0], nums[1], ..., nums[i]). * prefixGcd[i] = gcd(nums[i], mx

leetcode.com

유클리드 gcd 구현해보고 자료구조와 정렬해보는 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

현재까지의 최댓값을 저장할 current_max_num, 정답 누적값을 저장할 sum, prefixGcd를 선언 후 적절히 초기화해줍ㅂ니다.

📔 풀이과정

📑 prefixGcd 구하기
1. nums의 원소를 순회하며 현 원소 num과 current_max_num과 비교해 더 큰 값이 있다면 갱신해줍니다.

2. num과 current_max_num의 gcd값을 구합니다. gcd를 구할 때는 시간 초과가 되지 않기 위해 O(logN)으로 구현되어야 합니다.

📑 prefixGcd 오름차순으로 정렬하기

📑 누적합 구하기
prefixGcd의 양옆에서 가운데로 순회하며 양끝마다 구한 gcd값을 sum에 누적해 더해줍니다.

📑 시간 복잡도

O(NlogN): pregixGcd길이의 절반만큼 순회하며 gcd를 O(logN)만에 구하기 때문입니다.

📑 공간 복잡도

O(N): n만큼의 길이 배열을 생성하기 때문입니다.

📔 정답 출력 | 반환

sum을 반환합니다.


📕 Code

📔 Python3

class Solution:
    def gcd(a:int, b:int) -> int:
        if b == 0:
            return a
        return gcd(b, a%b)

    def gcdSum(self, nums: list[int]) -> int:
        prefixGcd = []

        sum = 0

        current_max_num = nums[0]

        for num in nums:
            current_max_num = max(current_max_num, num)
            prefixGcd.append(gcd(num,current_max_num))
        prefixGcd.sort()

        prefix_gcd_len = len(prefixGcd)
        for i in range(prefix_gcd_len//2):
            sum += gcd(prefixGcd[i], prefixGcd[prefix_gcd_len-i-1])
        return sum

 


*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.