코딩테스트/프로그래머스

[프로그래머스] 숫자 카드 나누기- reduce, gcd

to,min 2024. 11. 28. 14:50

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/135807

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

접근 방식

최대공약수를 구한 후, 상대방 배열을 나눠보면 된다.

난 내장함수에 최대공약수 구하는 것이 있을 지 모르고 쌩으로 풀었지만

보통 reduce + gcd 를 조합해서 푸는 것 같다

 

 

import math

def findDivisor(arr):
    common_divisor = set()
    
    min_arr = min(arr)
    max_check = int(math.sqrt(min_arr))
    
    for i in range(1,max_check+1):
        if all(x % i == 0 for x in arr):
            common_divisor.add(i)
        if all(x % (min_arr//i) ==0 for x in arr) and (min_arr // i != i) and (min_arr // i != 1):
            common_divisor.add(min_arr//i)
            
    return sorted(common_divisor, reverse = True)
    
def solution(arrayA, arrayB):
    arrayA = list(set(arrayA))
    arrayB = list(set(arrayB))
    a_common_divisor = findDivisor(arrayA)
    b_common_divisor = findDivisor(arrayB)
    
    a_max,b_max = 0,0
    for i in a_common_divisor:
        if all(x % i !=0 for x in arrayB):
            a_max = i
            break
                
    for i in b_common_divisor:
        if all(x % i !=0 for x in arrayA):
            b_max = i
            break

    return max(a_max,b_max)

 

 

내장함수 활용

from functools import reduce
from math import gcd


def solution(nums1, nums2):
    gcd1, gcd2 = reduce(gcd, nums1), reduce(gcd, nums2)
    answer = []
    if all(each % gcd2 for each in nums1):
        answer.append(gcd2)
    if all(each % gcd1 for each in nums2):
        answer.append(gcd1)
    return max(answer) if answer else 0