Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 단기개발자코스
- 프로그래머스
- 개발자 취업
- 구글 OAuth login
- Python
- 개발자부트캠프추천
- TiL
- 전략패턴 #StrategyPattern #디자인패턴
- 항해99
- spring batch 5.0
- JavaScript
- 취업리부트코스
- 빈 충돌
- jwttoken
- 인프콘 2024
- 커스텀 헤더
- 디자인 패턴
- jwt
- 코딩테스트 준비
- infcon 2024
- 빈 조회 2개 이상
- 1주일회고
- DesignPattern
- KPT회고
- 디자인패턴
- @FeignClient
- 99클럽
- Spring multimodule
- 파이썬
- 프로그래머스 이중우선순위큐
Archives
- Today
- Total
m1ndy5's coding blog
[수학] 백준 2609번 최대공약수와 최소공배수 with python (유클리드 호제법) 본문
https://www.acmicpc.net/problem/2609
a, b = map(int, input().split())
gcd = 1
for i in range(abs(a-b), 1, -1):
if a%i == 0 and b%i == 0:
gcd *= i
a //= i
b //= i
lcm = gcd*a*b
print(gcd)
print(lcm)
옛날에 학생때 최대공배수 최대공약수를 구할 때 13, 17같은 한번에 알아차리기 어려운 소수들이 있어서 썻던 방법이 큰 수에서 작은 수를 뺀 차이의 약수로 나누는 수를 결정했던 기억이 있었다. 그냥 내가 그렇게 풀었었다ㅋㅋㅋㅋ
근데 그렇게 풀었는데 틀렸다고 나옴ㅎㅎ 근데 정확히 아직 반례를 찾진 못했다ㅜㅜ
그래서 무슨 방법으로 풀어야 잘 풀었다고 소문이 날까 하고 찾아보던 중 유클리드 호제법을 사용하면 된다는 블로그를 봤다!
유클리드 호제법이란?
두 개의 자연수 a와 b에서(단 a>b) a를 b로 나눈 나머지를 r이라고 했을때 GCD(a, b) = GCD(b, r)과 같고 r이 0이면 그때 b가 최대공약수
따라서 b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수라는 특징이 있다.
a, b = map(int, input().split())
if a > b:
big = a
small = b
else :
big = b
small = a
r = big % small
while r != 0:
big = small
small = r
r = big % small
print(small)
print(a * (b//small))
그 특징을 그대로 코드로 옮겼다.
def gcd(a, b):
while b > 0:
a, b = b, a % b
return a
def lcm(a, b):
return a * b // gcd(a, b)
그리고 굉장히 간단한 코드를 찾았다...ㅎ
이미 파이썬에선 사실 gcd와 lcm 함수를 제공하긴한다.
그래도 이런 원리를 알고 푸니까 신기했던 문제였다!
'알고리즘 with python > 수학' 카테고리의 다른 글
[수학] 백준 6588번 골드바흐의 추측 with 파이썬 (0) | 2023.03.09 |
---|---|
[수학] 백준 9020번 골드바흐의 추측 with python (0) | 2023.03.07 |
[수학] 백준 15649번 N과 M(1) with python (0) | 2023.03.01 |
[수학] 백준 4948번 베르트랑 공준 with Python(pypy3와 python3의 차이점은?) (0) | 2023.02.27 |
[수학] 백준 1978 소수 찾기 with python (0) | 2023.02.27 |