Programming/프로그래머스

프로그래머스 - [Level 2] 숫자 카드 나누기 (파이썬)

pental 2025. 4. 2. 23:22

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이

두 배열이 주어졌을 떄, 한 배열의 모든 수를 나누면서 다른 배열의 어떤 수로도 나누어지지 않는 수중에서 최대값을 찾는 문제이다.

내가 접근한 방식은 다음과 같다.

두배열 arrayA, arrayB가 주어지고,

  1. x는 arrayA의 모든 원소를 나눌수 있어야한다.
  2. x는 arrayB의 어떤 원소도 나눌 수 없어야한다.
  3. 또는 반대로 x는 arrayB의 모든 원소를 나눌 수 있어야한다.
  4. x는 arrayA의 어떤 원소도 나눌 수 없어야한다.
from math import gcd
from functools import reduce

새로운 모듈을 발견해서 사용해봤다. gcd 모듈은 최대 공약수를 구할때 사용하고, reduce는 처음 써봤는데, 배열 내 모든 요소에 대해 gcd를 적용해서 전체의 최대공약수를 구하기 위해서 사용했다.

def check(a, arr):
    for num in arr:
        if num % a == 0:
            return False
    return True

특정 수 a가 주어졌을때, 배열 arr은 어떤수로도 나누어지지 않으면 True를 반환하고, 나누어졌을 때는 False를 반환함으로써, 조건 2를 만족하는지 검사하는 함수를 하나 생성했다.

def solution(arrayA, arrayB):
    answer = 0
    gcdA = reduce(gcd, arrayA)  # arrayA의 모든 수의 최대공약수
    gcdB = reduce(gcd, arrayB)  # arrayB의 모든 수의 최대공약수

arrayA, arrayB의 각각의 전체 최대 공약수를 구하고, 이 값이 각 배열을 전부 나눌 수 있는 후보 숫자가 된다.

    a = 0
    b = 0

    if check(gcdA, arrayB):
        a = gcdA
    if check(gcdB, arrayA):
        b = gcdB

gcdA가 check가 돌아가 후보 a, gcdB가 check가 돌아가면 후보 b~

그리고 두 후보 중 최댓값을 반환하면 문제 풀이 끝.

코드

from math import gcd
from functools import reduce

def check(a, arr) :
    for num in arr :
        if num % a == 0 :
            return False
    return True

def solution(arrayA, arrayB):
    answer = 0
    gcdA = reduce(gcd, arrayA)
    gcdB = reduce(gcd, arrayB)
    
    a = 0
    b = 0
    
    if check(gcdA, arrayB) :
        a = gcdA
    if check(gcdB, arrayA) :
        b = gcdB
    
    answer = max(a, b)
    return answer