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)란 두 수 이상의 여러 수의 공약수 중 최대인 수를 가리킵니다.
최소공배수(Lowest Common Multiple, LCM)
두 수 a, b의 최소공배수는 lcm(a, b) 또는 [a, b]로 나타냄.
공배수(common multiple)란 두 수 이상의 여러 수의 공통된 배수를 의미합니다.
최소공배수(LCM)란 두 수 이상의 여러 수의 공배수 중 최소인 수를 가리킵니다.
Reference
http://www.tcpschool.com/codingmath/common
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
programmers) 로그인 성공? (0) | 2022.11.12 |
---|---|
programmers) 삼각형의 완성조건 (2) (0) | 2022.11.11 |
programmers) 직사각형 넓이 구하기 (0) | 2022.11.10 |
programmers) 문자열 밀기 (0) | 2022.11.10 |
programmers) 캐릭터의 좌표 (1) | 2022.11.10 |