철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 합니다.
예를 들어, 카드들에 10, 5, 20, 17이 적혀 있는 경우에 대해 생각해 봅시다. 만약, 철수가 [10, 17]이 적힌 카드를 갖고, 영희가 [5, 20]이 적힌 카드를 갖는다면 두 조건 중 하나를 만족하는 양의 정수 a는 존재하지 않습니다. 하지만, 철수가 [10, 20]이 적힌 카드를 갖고, 영희가 [5, 17]이 적힌 카드를 갖는다면, 철수가 가진 카드들의 숫자는 모두 10으로 나눌 수 있고, 영희가 가진 카드들의 숫자는 모두 10으로 나눌 수 없습니다. 따라서 철수와 영희는 각각 [10, 20]이 적힌 카드, [5, 17]이 적힌 카드로 나눠 가졌다면 조건에 해당하는 양의 정수 a는 10이 됩니다.
철수가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayA
와 영희가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayB
가 주어졌을 때, 주어진 조건을 만족하는 가장 큰 양의 정수 a를 return하도록 solution 함수를 완성해 주세요. 만약, 조건을 만족하는 a가 없다면, 0을 return 해 주세요.
def solution(arrayA, arrayB):
arrayA.sort()
arrayB.sort()
answerA = 1; answerB = 1
sA = arrayA[0]; sB = arrayB[0];
for i in arrayA[1:]:
sA = gcd(sA, i)
for i in arrayB[1:]:
sB = gcd(sB, i)
if div(arrayA, sB):
answerA = max(answerA, sB)
if div(arrayB, sA):
answerB = max(answerB, sA)
if answerA == 1 and answerB == 1:
return 0
else:
return max(answerA, answerB)
# 최대공약수 구하기(유클리드 호제법)
def gcd(a, b):
# a : 작은 수, b : 큰 수
while b != 0:
if a > b:
a, b = b, a
b = b % a
return a
# 배열의 모든 원소 중 하나라도 최대공약수에 의해 나뉘면 False
def div(array, gcd):
for i in array:
if i % gcd == 0:
return False
return True