프로그래머스 - [Level 2] 숫자 카드 나누기 (파이썬)
글 작성자: pental
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
'Programming > 프로그래머스' 카테고리의 다른 글
프로그래머스 - [Level 2] 전력망을 둘로 나누기 (파이썬) (1) | 2025.04.02 |
---|---|
프로그래머스 - 배달 (파이썬) (0) | 2025.03.30 |
프로그래머스 - 마법의 엘리베이터 (파이썬) (0) | 2025.03.29 |
프로그래머스 - 택배 상자 꺼내기 (파이썬) (0) | 2025.03.26 |
[프로그래머스] 달리기 경주 (2) | 2025.03.24 |
댓글
이 글 공유하기
다른 글
-
프로그래머스 - [Level 2] 전력망을 둘로 나누기 (파이썬)
프로그래머스 - [Level 2] 전력망을 둘로 나누기 (파이썬)
2025.04.02 -
프로그래머스 - 배달 (파이썬)
프로그래머스 - 배달 (파이썬)
2025.03.30 -
프로그래머스 - 마법의 엘리베이터 (파이썬)
프로그래머스 - 마법의 엘리베이터 (파이썬)
2025.03.29 -
프로그래머스 - 택배 상자 꺼내기 (파이썬)
프로그래머스 - 택배 상자 꺼내기 (파이썬)
2025.03.26