CS/알고리즘
[TIL] 20240307 17일차
creative.darkstar
2024. 3. 7. 23:48
프로그래머스 분수의 덧셈
https://school.programmers.co.kr/learn/courses/30/lessons/120808
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이를 위해서
- 두 분수의 분모의 최소공배수
- 두 분수를 더한 후 분자, 분모의 1보다 큰 최대공약수로 나눔(약분)
과정이 필요하여 최소공배수, 최대공약수를 구하는 함수를 작성했다.
def lcm(num1, num2):
min_val = min(num1, num2)
max_val = max(num1, num2)
for i in range(1, max_val + 1):
if (min_val * i) % max_val == 0:
return min_val * i
최소공배수 코드이다.
두 수 A, B의 최소공배수를 구한다고 할 때
예를 들어 A =< B 라는 관계가 성립한다면
A * n을 B로 나눈 나머지가 0이게 하는 최소의 n을 구하면 되므로
for 문에 range를 통해 1부터 B까지 n을 1씩 증가시키며 n을 구하는 즉시 최소공배수를 리턴하며 함수를 종료한다.
def gcd(num1, num2):
min_val = min(num1, num2)
max_val = max(num1, num2)
for num in range(min_val, 0, -1):
if max_val % num == 0 and min_val % num == 0:
return num
최대공약수 코드이다.
두 수 A, B의 최대공약수를 구한다고 할 때
예를 들어 A =< B 라는 관계가 성립한다면
A 와 B 를 n으로 나눈 나머지가 0이게 하는 최대의 n을 구하면 되므로
for 문에 range를 통해 A부터 1까지 n을 1씩 감소시키며 n을 구하는 즉시 최대공약수를 리턴하며 함수를 종료한다.
최소공배수, 최대공약수를 이용하면
두 분수의 합을 구할 수 있게 된다.
더보기
def gcd(num1, num2):
min_val = min(num1, num2)
max_val = max(num1, num2)
for num in range(min_val, 0, -1):
if max_val % num == 0 and min_val % num == 0:
return num
def lcm(num1, num2):
min_val = min(num1, num2)
max_val = max(num1, num2)
for i in range(1, max_val + 1):
if (min_val * i) % max_val == 0:
return min_val * i
def solution(numer1, denom1, numer2, denom2):
denom_sum = lcm(denom1, denom2)
numer_sum = numer1 * (denom_sum // denom1) + numer2 * (denom_sum // denom2)
answer = [numer_sum // gcd(numer_sum, denom_sum), denom_sum // gcd(numer_sum, denom_sum)]
return answer