본문 바로가기
프로그래머스/Python

[프로그래머스] 숫자 카드 나누기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2024. 3. 23.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

반응형

2. 풀이과정

해당 문제는 두 조건 중 하나라도 만족하는 가장 큰 양의 정수를 구하는 문제이다.

각 조건을 만족하는지 판별하는 방법은 각 카드 리스트의 최대 공약수를 구하여 구한 최대 공약수를 다른 리스트의 카드 값에 나누어 봤을 때 모두 나누어 떨어지지 않으면 된다.

 

각 리스트의 최대 공약수를 구할 때는 math 라이브러리의 gcd() 함수를 사용한다.

그렇게 구한 각 리스트의 최대 공약수를 다른 리스트의 값들과 모두 나누어 0이면 True를, 0이 아니면 False 값으로 저장한 후 0이 아닌 값(False)의 개수가 해당 리스트의 카드 개수와 동일하면 해당 최대 공약수가 조건을 만족하는 수가 된다.

각 리스트 별로 조건을 만족하는지 판별하고 조건을 만족하는 최대 공약수 중 큰 값을 출력하면 된다.

 

  1. 최대 공약수를 구해주는 gcd() 함수를 가진 math 라이브러리를 불러온다. import math
  2. 철수의 카드 값들의 최대 공약수를 저장할 변수를 생성하고 초기화한다. maxGCD_A = 0
  3. 철수의 카드 값들을 하나씩 불러와 for a in arrayA
    1. 이전까지 수의 중 최대공약수와 해당 수의 최대 공약수를 구한다. maxGCD_A = math.gcd(maxGCD_A, a)
  4. 영희의 카드 값들의 최대 공약수를 저장할 변수를 생성하고 초기화한다. maxGCD_B = 0
  5. 영희의 카드 값들을 하나씩 불러와 for b in arrayB
    1. 이전까지 수의 최대 공약수와 해당 수의 최대 공약수를 구한다. maxGCD_B = math.gcd(maxGCD_B, b)
  6. 영희 카드 값들의 최대 공약수를 가지고 철수 카드 값들을 모두 나누어 보고 그 값이 나누어 떨어지면 True를, 나누어 떨어지지 않으면 False 값을 저장한 리스트를 생성한다. resultA = list(a % maxGCD_B == 0 for a in arrayA)
  7. 만약 철수 카드가 모두 나누어 떨어지지 않았다면 조건을 만족한 것이므로 if (resultA.count(False) == len(arrayA))
    1. 현재 정답과 나눈 최대 공약수 중 큰 값을 정답에 저장한다. answer = max(answer, maxGCD_B)
  8. 철수 카드 값들의 최대 공약수를 가지고 영희 카드 값들을 모두 나누어 보고 그 값이 나누어 떨어지면 True를, 나누어 떨어지지 않으면 False 값을 저장한 리스트를 생성한다. resultB = list(b % maxGCD_A == 0 for b in arrayB)
  9. 만약 영희 카드가 모두 나누어 떨어지지 않았다면 조건을 만족한 것이므로 if (resultB.count(False) == len(arrayB))
    1. 현재 정답과 나눈 최대 공약수 중 큰 값을 정답에 저장한다. answer = max(answer, maxGCD_A)

3. 소스코드

import math

def solution(arrayA, arrayB):
    answer = 0
    
    maxGCD_A = 0
    for a in arrayA:
        maxGCD_A = math.gcd(maxGCD_A, a)

    maxGCD_B = 0
    for b in arrayB:
        maxGCD_B = math.gcd(maxGCD_B, b)

    resultA = list(a % maxGCD_B == 0 for a in arrayA)
    if (resultA.count(False) == len(arrayA)):
         answer = max(answer, maxGCD_B)

    resultB = list(b % maxGCD_A == 0 for b in arrayB)
    if (resultB.count(False) == len(arrayB)):
        answer = max(answer, maxGCD_A)
            
    return answer
728x90
반응형