숫자 카드 나누기

Ssoony의 Velog·2024년 6월 28일
0

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

import math
def solution(arrayA, arrayB):
    gcdA=arrayA[0]
    gcdB=arrayB[0]
    for i in arrayA[1:]:
        gcdA=math.gcd(gcdA,i)
    for i in arrayB[1:]:
        gcdB=math.gcd(gcdB,i) 
    for i in arrayA:
        if i%gcdB==0:
            gcdB=1
    for i in arrayB:
        if i%gcdA==0:
            gcdA=1
    if gcdA==1 and gcdB==1:
        return 0
    else:
        return max(gcdA, gcdB)

각 배열의 최대공약수를 구해서 이를 다른 배열에 나누었을 때, 나누어지지 않는 수를 찾는 문제였다.

최대공약수를 찾는 이유는 각 배열의 모든 수가 다 나누어 떨어지는 수 중에서 가장 큰 수 = 최대공약수

따라서 최대공약수의 약수로 주어진 배열들이 다 나누어 떨어진다고 할 수 있다.

여기서 찾은 최대공약수로 남은 배열을 나누었을 때, 나누어지지 않은 가장 큰 수를 찾으라고 하였으므로

최대공약수로 나누어지는 숫자는 최대공약수의 약수(더 작은 수)로도 당연히 나누어 떨어진다.

따라서 여기서는 각 배열의 최대공약수를 찾은 후 이 수로 다른 배열의 모든 수를 나누었을 때, 나누어 떨어지지 않으면 이 수가 정답이 된다.

따라서 math 모듈의 gcd함수를 활용하여 각 배열의 최대공약수를 구하였다.

이후에는 각 배열이 다른 배열의 최대공약수로 나누어지는지 확인한 후, 나누어지면 만족하는 수가 없는 것이기 때문에 최대공약수를 1로 변경해주었다.

마지막으로 각각의 최대공약수가 1이면 모두를 만족하는 수가 없다는 뜻이기 때문에 0을 반환하고,

아니라면 각각의 최대공약수 중에 큰 수를 반환하였다.

profile
개발자로 성장하기 위한 한걸음

0개의 댓글