[프로그래머스] 유한소수 판별하기

Vincent·2023년 1월 25일
0

문제 설명

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

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

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

제한사항

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

입출력 예

abresult
7201
11221
12212

입출력 예 설명

입출력 예 #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합니다.

풀이

활용개념 : 에라토스테네스의 체

  • 다수의 자연수에 대하여 소수 여부를 판별할 때 사용하는 대표적인 알고리즘이다
  • 에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾을 때 사용할 수 있다

<동작과정>
1. 2부터 𝑁까지의 모든 자연수를 나열한다
2. 남은 수 중에서 아직 처리하지 않은 가장 작은 수 𝑖를 찾는다
3. 남은 수 중에서 i의 배수를 모두 제거한다(𝑖는 제거하지 않는다)
4. 더 이상 반복할 수 없을 때까지 2번과 3번의 과정을 반복한다

import math
def solution(a, b):
    # 기약분수 만들기
    s = math.gcd(a,b)
    a = a // s
    b = b // s
    
    #에라토스테네스의 체
    array = [True for i in range(b+1)]
    
    for i in range(2,b+1):
        if array[i] == True:
            j = 2 #i는 제외한 배수 제거
            while i * j <= b:
                array[i * j] = False
                j += 1
    
    lst = []
    for k in range(2,len(array)):
        if (array[k] == True) and (b % k == 0): #약수들만 담기
            lst.append(k)
    
    for i in lst:
        if i ==2 or i == 5:
            continue
        else:
            return 2 #2나 5가 아닌 값이 나오면 바로 종료
    return 1
profile
Frontend & Artificial Intelligence

0개의 댓글