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가 주어지고,
- x는 arrayA의 모든 원소를 나눌수 있어야한다.
- x는 arrayB의 어떤 원소도 나눌 수 없어야한다.
- 또는 반대로 x는 arrayB의 모든 원소를 나눌 수 있어야한다.
- 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