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))
위에서 짠 코드와 비교했을때
훨씬 간단해 진 것을 볼 수 있다.
알고리즘 문제를 풀때 기존 상식으로 코드를 구현하는 경험도 필요하지만,
문제를 좀 더 효율적으로 풀 수 있는 알고리즘 학습의 중요성을 깨달았다.
'PS' 카테고리의 다른 글
[백준] 1929번 : 소수 구하기(에라토스테네스의 체)- 파이썬[Python] (0) | 2022.01.04 |
---|---|
[백준] 1002번 : 터렛(두 원의 위치 관계)- 파이썬[Python] (0) | 2022.01.04 |
[백준] 1316번 : 그룹 단어 체커- 파이썬[Python] (0) | 2022.01.03 |
[백준] 1789번 : 수들의 합 - 파이썬[Python] (0) | 2021.12.29 |
[백준] 11653번 : 소인수분해 - 파이썬[Python] (0) | 2021.12.29 |
댓글