View

문제 설명

소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.

  • 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.

두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.


제한사항
  • a, b는 정수
  • 0 < a ≤ 1,000
  • 0 < b ≤ 1,000

입출력 예abresult
7 20 1
11 22 1
12 21 2

입출력 예 설명

입출력 예 #1

  • 분수 7/20은 기약분수 입니다. 분모 20의 소인수가 2, 5 이기 때문에 유한소수입니다. 따라서 1을 return합니다.

입출력 예 #2

  • 분수 11/22는 기약분수로 나타내면 1/2 입니다. 분모 2는 소인수가 2 뿐이기 때문에 유한소수 입니다. 따라서 1을 return합니다.

입출력 예 #3

  • 분수 12/21는 기약분수로 나타내면 4/7 입니다. 분모 7은 소인수가 7 이므로 무한소수입니다. 따라서 2를 return합니다.

Hint
  • 분자와 분모의 최대공약수로 약분하면 기약분수를 만들 수 있습니다.
  • 정수도 유한소수로 분류합니다.

※ 공지 - 2022년 11월 10일 테스트 케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.

 


나의 풀이

소인수분해 시에는 먼저 소수를 구하는 과정이 필요하다.

def calculate(a,b): # 약수를 구하는 공식
    r = []
    for i in range(2, max(a,b)+1):
        if a % i == 0 and b % i == 0:
            calculate(a//i, b//i)
            r.append(i)
    return r

def findPrimes(n): # 소인수를 구하는 공식
    r = []
    for i in range(2,n+1):
        if n % i == 0:
            r.append(i)
    return r
  

def solution(a,b):
    if (a/b) * 10== int(a/b) * 10: # 정수일 경우 
        return 1
    r = calculate(a,b)
    if not r:          # 기약분수여서 공약수가 없는 경우
        under = b                       
    else:              # 공약수가 있는 경우 
        under = b//max(r) # 분모를 최대공약수로 나누어 기약분수로 만들어준다.
    primes = findPrimes(under) # 분모가 under라면 2~under 까지의 소인수 찾기
    factors = []
    for a in primes:            # 소인수분해 공식
        while (under % a == 0): 
            factors.append(a)
            under = under // a # 몫을 소인수로 나누었을때, 나누어 떨어질때 까지 계속 나눈다.
    rr = sorted(list(set(factors)),key=lambda x:x)
    if rr == [2] or rr == [5] or rr == [2,5]:
        return 1
    else:
        return 2

다른 풀이

먼저 최대공약수를 구한뒤 분모로 나누어 주었다.

최대공약수로 나눈후, 2와 5로 계속 나누어 떨어질때 까지 나눈 후

몫이 1이 된다면, 더이상 나눌 수 있는 것이 없으므로, 1을 return 해준다.

몫이 2가 된다면, 2와 5를 제외한 다른 소수가 있는 것이므로, 2를 return 해준다.

from math import gcd
def solution(a, b):
    b //= gcd(a,b)
    while b%2==0:
        b//=2
    while b%5==0:
        b//=5
    return 1 if b==1 else 2

최대공약수(Greatest Common Divisor, GCD)

두 수 a, b의 최대공약수는 gcd(a, b) 또는 (a, b)로 나타냄.

공약수(common divisor)란 두 수 이상의 여러 수의 공통된 약수를 의미합니다.

최대공약수(GCD)란 두 수 이상의 여러 수의 공약수 중 최대인 수를 가리킵니다.

gcd(a, b)

 

최소공배수(Lowest Common Multiple, LCM)

두 수 a, b의 최소공배수는 lcm(a, b) 또는 [a, b]로 나타냄.

공배수(common multiple)란 두 수 이상의 여러 수의 공통된 배수를 의미합니다.

최소공배수(LCM)란 두 수 이상의 여러 수의 공배수 중 최소인 수를 가리킵니다.

lcm(a, b)

 

 

 

Reference

http://www.tcpschool.com/codingmath/common

https://upgrade-j.tistory.com/entry/python%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%86%8C%EC%9D%B8%EC%88%98-%EB%B6%84%ED%95%B4-%ED%95%98%EA%B8%B0

 

Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31