https://school.programmers.co.kr/learn/courses/30/lessons/135807
문제 설명
철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 합니다.
- 철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
- 영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고, 철수가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
예를 들어, 카드들에 10, 5, 20, 17이 적혀 있는 경우에 대해 생각해 봅시다. 만약, 철수가 [10, 17]이 적힌 카드를 갖고, 영희가 [5, 20]이 적힌 카드를 갖는다면 두 조건 중 하나를 만족하는 양의 정수 a는 존재하지 않습니다. 하지만, 철수가 [10, 20]이 적힌 카드를 갖고, 영희가 [5, 17]이 적힌 카드를 갖는다면, 철수가 가진 카드들의 숫자는 모두 10으로 나눌 수 있고, 영희가 가진 카드들의 숫자는 모두 10으로 나눌 수 없습니다. 따라서 철수와 영희는 각각 [10, 20]이 적힌 카드, [5, 17]이 적힌 카드로 나눠 가졌다면 조건에 해당하는 양의 정수 a는 10이 됩니다.
철수가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayA와 영희가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayB가 주어졌을 때, 주어진 조건을 만족하는 가장 큰 양의 정수 a를 return하도록 solution 함수를 완성해 주세요. 만약, 조건을 만족하는 a가 없다면, 0을 return 해 주세요.
너무.. 바로 풀려서 당황스러운 문제,,
최대공약수를 구하는 gcd 알고리즘을 안다면 누구나 금방 풀 수 있을 것 같다ㅎㅎ
풀이과정
1. 각 배열의 최대공약수를 구한다.
2. 구한 두 최대공약수들이 상대방 배열의 모든 값들과 나누어지지 않는다면 정답이 될 수 있다.
3. 가능한 정답값들 중 가장 큰 값을 반환한다. 가능한 정답값이 없다면 0을 반환한다.
<< 전체 코드 >>
def gcd(a, b): # 두 수의 최대공약수를 구하기
if b == 0:
return a
return gcd(b, a % b)
def search_divisor(arr): # 배열값들의 최대공약수를 구하기
n = arr[0]
for i in range(1, len(arr)):
n = gcd(n, arr[i])
return n
def possible(n, arr): # 상대방 배열의 모든 값들과 나누어지지 않는지 확인하기
for k in arr:
if k % n == 0:
return False
return True
def solution(A, B):
# 1
divisorA = search_divisor(A)
divisorB = search_divisor(B)
# 2
cases = []
if divisorA != 1 and possible(divisorA, B):
cases.append(divisorA)
if divisorB != 1 and possible(divisorB, A):
cases.append(divisorB)
cases.sort(reverse=True)
# 3
if cases == []:
return 0
return cases[0]
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Level3] 아이템 줍기 - 파이썬(Python) - 깊이/너비 우선 탐색(DFS/BFS) (0) | 2022.12.27 |
---|---|
[프로그래머스 Level3] 풍선 터트리기 - 파이썬(Python) - 월간 코드 챌린지 시즌1 (0) | 2022.12.27 |
[프로그래머스 Level3] 섬 연결하기 - 파이썬(Python) (0) | 2022.12.13 |
[프로그래머스 Level2] 후보키 - 파이썬(Python) - 2019 KAKAO BLIND RECRUITMENT (0) | 2022.12.09 |
[프로그래머스 Level2] 디펜스 게임 - 파이썬(Python) (1) | 2022.12.09 |