bong-u/til

프로그래머스 - 숫자 카드 나누기 (L2)

수정일 : 2023-07-31

  • 첫번째 통과한 풀이

     1import math
     2
     3def gcd(a, b):
     4    while b > 0:
     5        a, b = b, a%b
     6    return a
     7
     8def gcdOfArr(l):
     9    result = l[0]
    10    for i in range(1, len(l)):
    11        result = gcd(result, l[i])
    12    return result
    13
    14def solution(arrayA, arrayB):
    15    a1 = gcdOfArr(arrayA)
    16    for i in arrayB:
    17        if i % a1 == 0:
    18            a1 = 0
    19            break
    20    a2 = gcdOfArr(arrayB)
    21    for i in arrayA:
    22        if i % a2 == 0:
    23            a2 = 0
    24            break
    25    return max(a1, a2)
    
  • 개선한 풀이

     1import math
     2from functools import reduce
     3
     4def gcd(a, b):
     5    while b > 0:
     6        a, b = b, a%b
     7    return a
     8
     9def solution(arrayA, arrayB):
    10    a1 = reduce(gcd, arrayA)
    11    a1 = 0 if any(i % a1 == 0 for i in arrayB) else a1
    12    a2 = reduce(gcd, arrayB)
    13    a2 = 0 if any(i % a2 == 0 for i in arrayA) else a2
    14    return max(a1, a2)
    

문제

  • 철수가 가진 숫자의 배열 arrayA, 영희가 가진 숫자의 배열 arrayB가 주어진다
  • 철수가 가진 카드들의 모든 숫자를 나눌 수 있고, 영희가 가진 숫자는 하나도 나눌 수 없는 양의 정수 a
  • 영희가 가진 카드들의 모든 숫자를 나눌 수 있고, 철수가 가진 숫자는 하나도 나눌 수 없는 양의 정수 a
  • 가장 큰 양의 정수 a를 구하라, 없다면 0을 반환하라
  • TC
    • input

      [14, 35, 119]

    • ouput

      7

해결방법

  • 프로그래머스에서 지원하는 파이썬이 3.8이라서 내장함수 math.gcd(3.9부터 지원)를 사용하지 못했다
  • 유클리드 호제법 기억이 나지 않아서 약간의 구글링을 통해 해결하였다
  • reduce와 any함수를 통해 코드의 길이를 대폭 감소 시킬 수 있었다, 자주 활용하자