PS
[백준] 1934번 : 최소공배수(유클리드 호제법)- 파이썬[Python]
choisanghyun
2021. 12. 29. 15:46
728x90
문제
1934번: 최소공배수
두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있
www.acmicpc.net
풀이
처음에는 위 공식과 같이
초등학교때 배웠던 최소 공배수를 구하는 공식으로 코드를 짰었지만
T=int(input())
c=[]
def multiply(arr):
ans = 1
for n in arr:
ans *= n
return ans
for i in range(T):
A = list(map(int,input().split()))
n = 2
if A[0]==1 or A[1]==1: #한 쪽 수가 1일 경우
print(max(A))
continue
while n <= max(A):
if (A[0]%n==0) and (A[1]%n)==0:
c.append(n)
A[0]=A[0]/n
A[1]=A[1]/n
n=2
else:
n+=1
print(int(multiply(c)*A[0]*A[1]))
코드가 너무 복잡하고 값이 나오긴 하는데 초과출력의 문제와
입력값이 너무 커지면 시간이 오래걸리는 문제에 봉착했다.
유클리드 호제법
시행착오 끝에
이 문제는 유클리드 호제법을 활용해서 푸는 문제임을 알게 되었다.
양수의 나머지의 나머지를 계속 연산하여
나머지가 0이 되었을때 작은 수가 최대공약수 이며
기존 두 수를 곱한 값을 최대공약수로 나눈값이 최소 공배수이다.
T=int(input())
for i in range(T):
A,B = map(int,input().split())
a=A
b=B
n=1
while n!=0:
n=a%b
a=b
b=n
print(int(A*B/a))
위에서 짠 코드와 비교했을때
훨씬 간단해 진 것을 볼 수 있다.
알고리즘 문제를 풀때 기존 상식으로 코드를 구현하는 경험도 필요하지만,
문제를 좀 더 효율적으로 풀 수 있는 알고리즘 학습의 중요성을 깨달았다.