강의로 돌아가기
김민석

최대 공약수만 비교할게 아니라

최대 공약수의 약수들 중 상대편 카드뭉치 수들중 하나도 안 나누어 떨이지는 수의 최대값을 비교해줘야 하는게 아닌가요?
왜 최대공약수만 비교해줘도 모든 테케가 통과되는지 저는 이해가 잘 안가서요.. 혹시 가르쳐주실 분 계실까요?

작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""
철수, 영희의 카드뭉치들의 수를 통해 각각 최대공약수를 구하고,
각각 서로의 카드뭉치를 탐색하며, gcd철수가 영희 카드중 나누어떨어지면, 0으로 만들고 break
gcd영희가 철수 카드중 나누어 떨어지면, 0으로 만들고 break해서
철수 영희중 최대값을 return하면 된다.

"최대공약수"란 모든 숫자에 대해, 공통적으로 나누어 떨어지는 수 중 최대값을 의미
이 최대공약수의 약수들 중 상대편 카드뭉치에서 하나도 안나눠떨어지는 수의 최대값을 저장하고
이 최대값들 중 큰 값을 return.
"""
def solution(arrayA, arrayB):
    answer = 0
    def getNum(a,b):
        while b:
            a,b=b,a%b
        return a

    def getGcd(array):
        gcd_num = array[0]
        for i in range(1,len(array)):
            gcd_num = getNum(gcd_num,array[i])
        return gcd_num

    gcdA = getGcd(arrayA)
    gcdB = getGcd(arrayB)

    def get_arr(num):
        arr = []
        for i in range(2,num+1):
            if num%i==0:
                arr.append(i)
        return arr
    gcdA_arr = get_arr(gcdA)
    gcdB_arr = get_arr(gcdB)
    max_A = 0
    max_B = 0

    for j in range(len(gcdB_arr)):
        flag = True
        for i in range(len(arrayA)):
            if arrayA[i]%gcdB_arr[j] == 0:
                flag=False
                break
        if flag:
            max_B = gcdB_arr[j]

    for j in range(len(gcdA_arr)):
        flag = True
        for i in range(len(arrayB)):
            if arrayB[i]%gcdA_arr[j] == 0:
                flag=False
                break
        if flag:
            max_A = gcdA_arr[j]

    return max(max_A,max_B)
1 개의 답변
ShrimFry

arrayA가 모두 나누어 떨어지는 최대의 수 = 최대 공약수이고
필자 분의 말씀은 최대 공약수의 약수 목록 중에서 arrayB가
나누어지지 않는 수를 찾아야 하는 것 이 아니냐? 라는 질문을 하셨는데

만약 arrayA의 최대 공약수가 72 라면
최대 공약수의 약수는
{1, 2, 3, 4, 6, 8, 9, 12, 18, 24, 36, 72} 들 이 있습니다.

하지만 arrayB에 72로 나누어 떨어지는 수(72의 배수) 가 있다면
당연히 72의 약수로도 나누어 떨어지게 됩니다.

따라서 최대 공약수만으로 계산하셔도 무방합니다.

만약 약수 크기에 상한이 있다면 (예 : 72의 약수 중 30이하)
의 경우엔 18(2, 3, 3)과 24(2, 2, 2, 3) 중에 나누어 떨어지지 않는 것 으로
골라야하는 문제가 됐을 겁니다.

  • 윤영민

    저도 질문자와 같은 질문이 있는데요. 답변하신 내용중에 arrayB가 72로 나누어 떨어지는 수가 없고 36으로 나누어 떨어지는 수가 있다고 하면 답은 36이 되어야할 것 같습니다. 그런데 그런 테스트케이스가 없네요. 그리고 입출력 예 3번의 arrayB인 경우에도 최대공약수는 6이지만 3으로 예를 들었습니다.

    윤영민―2023.01.18 00:16
  • semo

    나누어 떨어지지 않는 수를 찾는 겁니다. 그러므로 님이 말한 예시에선 72가 답이고 36은 답이 될 수 없는거죠. 그 다음 입출력 3번은 최대공약수인 6과 공약수인 3 둘 다 가능하지만 더 큰 수를 찾아야하기에 6이 되는겁니다. 즉 최대공약수만 비교해보면 되는거죠

    semo―2023.02.14 23:19
  • 박주훈

    @윤영민 arrayB에서 36으로 나누어떨어지는 수가 있고, 72로 나누어떨어지는 수가 없다면 답은 72가 되어야 합니다. 반대로 생각하신 것 같네요. (모든 arrayB의 숫자를 나눌수 없는 숫자가 와야하니까요) 반대로, 72로 나누어떨어지는 숫자이면서 36으로 나누어떨어지지 않는 숫자는 존재할 수가 없습니다. 72가 36의 배수이니까요. 이러한 이유로 최대공약수만의 비교만으로 가능한 것 같습니다. 저도 이 부분이 궁금해서 왔는데 궁금증이 풀렸네요

    박주훈―2023.03.07 18:16
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.