Practice/알고리즘

파이썬 알고리즘: 유한 소수 판별하기

밍미a 2022. 12. 6. 01:43
728x90

알고 넘어가야 할 이론:

math.gcd

import math

#최대 공약수 
print(math.gcd(20,45))  # 5
print(math.gcd(20,60,100)) #20
https://codingpractices.tistory.com/46

 


오늘 공부한 내용

더보기

문제:

 

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

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

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

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

 

입출력 예

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합니다.

내가 생각한 문제풀이 : 

문제를 보고 제일 먼저 든 생각은 기약분수를 먼저 구해야 한다는 생각이 들었다.
기약분수를 구하기 위해서는 두 수의 최대 공약수가 필요하다고 생각했고, 최대 공약수를 구하는 공식을 알아야 했다.
최대 공약수를 구하기 위해 1부터 하나씩 분자와 분모에 나눠줬고,둘다 나머지가 0일때 공약수라고 생각을 해서
for문을 이용해서 공약수를 계속 변수에 저장해주었고for문이 다 끝났을때에는 최대 공약수가 되어있도록 코드를 짰다.
그리고 그 다음은 유한소수를 구해줘야 하는데 이부분에서 조금 어려웠다. 제한사항인 1000언저리에서 자꾸 유한소수인데 무한소수라고 출력이 되는 바람에 한참 헤메다가 while문을 썼더니 해결이 되었다.

 

더보기

내코드:

def solution(a, b):
    answer = 0
    최대공약수 = 0
    # 최대공약수 구하기
    for x in range(1, a + 1):
        if a % x == 0 and b % x == 0:
            최대공약수 = x
    print(f'최대공약수 : {최대공약수}')
    a = a // 최대공약수
    b = b // 최대공약수
    print(f'a:{a}  b:{b}')

    n = b

    # 유한 소수 구하기
    while n % 2 == 0:
        n = n // 2
        print(f'2로 나눈 n: {n}')
    while n % 5 == 0:
        n = n // 5
        print(f'5로 나눈 n: {n}')

    if n == 1:
        answer = 1
    else:
        answer = 2

    print(f'answer 의 값 : {answer}')
    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

 

 


더 공부할 내용

파이썬 Math 내장함수

https://codingpractices.tistory.com/46

 

for문과 while문의 차이점

https://chaeyoung2.tistory.com/67

느낌점

처음 알고리즘을 공부할때만 해도 한문제도 못풀어서 절망했었는데

매일매일 꾸준히 풀다보니까 어느새 쉬운 단계는 스스로 생각해서 풀 수 있게 되었다. 

역시 알고리즘은 꾸준히 하는게 중요하다고 느꼈다.

요즘 알고리즘 스터디를 하면서 다른 사람들의 코드를 비교해보고 내가 풀지 못한 문제를 함께 고민하고

코드윗미 등을 통해서 함께 풀 수 있도록 도와주고 하다보니까 실력이 많이 향상된 것 같다.