프로그래머스/파이썬_입문

💫유한소수 판별하기

싱싱한복초이 2025. 1. 6. 03:59

https://school.programmers.co.kr/learn/courses/30/lessons/120878

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[문제 설명]

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

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

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

 

제한사항

  • a, b는 정수
  • 0 < a ≤ 1,000
  • 0 < b ≤ 1,000

[나의 풀이]

def gcd(x, y):
    for i in range(min(x, y), 0, -1):
        if x % i == 0 and y % i == 0:
            return i

def prime(n):
    answer = []
    d = 2
    while d <= n:
        if n % d == 0:
            n //= d
            if d not in answer:
                answer.append(d)
        else:
            d += 1
    return answer        
        
def solution(a, b):
    answer = 0
    aa = gcd(a, b)
    bb = b // aa  
    cc = prime(bb)
    
    if all(x in [2, 5] for x in cc): 
        answer += 1
    else:
        answer += 2
        
    return answer

 

[다른 풀이]

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
from math import gcd

def solution(a, b):
    b = b / gcd(a, b)
    for i in [2, 5]:
        while not b % i:
            b //= i

    return 1 if b == 1 else 2
def solution(a, b):
    answer = 0
    for i in range(2, min([a, b]) + 1):
        while a % i == 0 and b % i == 0:
            a = a // i
            b = b // i
    while b % 2 == 0:
        b = b // 2
    while b % 5 == 0:
        b = b // 5
    if b == 1:
        answer = 1
    else:
        answer = 2
    return answer

'프로그래머스 > 파이썬_입문' 카테고리의 다른 글

특이한 정렬  (0) 2025.01.08
💫겹치는 선분의 길이 + 스위핑  (0) 2025.01.07
💫평행  (0) 2025.01.05
저주의 숫자 3  (0) 2025.01.04
외계어 사전  (0) 2025.01.03