프로그래머스 lv2 숫자카드나누기
출처
https://school.programmers.co.kr/learn/courses/30/lessons/135807
풀이
from math import gcd
def gcdOf(arr):
g = arr[0]
for i in range(1,len(arr)):
g = gcd(g,arr[i])
return g
# 이문제는 두수의 최대공약수만 비교를 해보면 된다.
# 왜그럴까?
# arrayA의 최대공약수를 A라고 하자
# arrayB를 값들을 A로 나누어보겟지
# 나누어졌다면 답이 될수가 없어
# 그러면 더 작은 arrayA의 공약수로 a로 시도해보겟다. (A = a*x)
# arrayB 값들을 a로 반드시 나눌수 있다.
# arrayB 중 하나의 값을 b라고 하면 b = A * y = a*x*y 이기 때문이다.
def solution(arrayA, arrayB):
gcdA, gcdB = gcdOf(arrayA), gcdOf(arrayB)
answer = 0
# A의 최대공약수로 B의 모든 원소를 나누어본다.
for i in range(len(arrayB)):
if arrayB[i]%gcdA==0:
break
# 만약 모두 나눌수없다면 답이 될수 있다.
else:
answer = gcdA
# B의 최대공약수로 A의 모든 원소를 나누어본다.
for i in range(len(arrayA)):
if arrayA[i]%gcdB==0:
break
# 만약 모두 나눌수없다면 답이 될수 있다.
else:
answer = max(answer, gcdB)
return answer
Leave a comment