IdoCleanCode
article thumbnail
반응형

코딩 테스트 - 프로그래머스

 

 

문제

첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성 해보세요.

 

 

원리

이 문제의 핵심 원리는 두 분수의 덧셈과 최대공악수 구하는 것입니다.

최대 공약수 구하기

유클리드 호제법은 두 개의 자연수에 대한 최대 공약수를 구하는 알고리즘 입니다. 원리는 다음과 같습니다

  1. 두 수 A와 B(A > B)가 있을때, A를 B로 나눈 나머지를 R이라고 할 때, A와 B의 최대공약수는 B와 R의 최대 공약수와 같다는 원리 입니다.

  2. A는 B가 되고 B는 나머지(A = B, B = R) 가 되며, 이 원리를 반복적으로 적용하면, 나머지가 0이 되는 순간의 나누는 수가 두수의 최대 공약수(GCD)가 됩니다.

예를 들어 A가 24, B가 18일때 나눈 나머지가 R이 6이 됩니다. A가 B가 되고 B가 R이 되고 이원리를 반복해 R이 0이 되면,  R와 B가 최소의 A,B의 최대 공약수가 됩니다.

최대공약수 구하기
최대공약수 구하기
최대공약수 구하기
최대공약수 구하기

분수의 덧셈

  1. 공통 분모 찾기
    두 분수의 분모를 곱하여 공통 분모를 찾습니다. 예를 들어 1/2와 3/4 경우, 공통 분모는 2 * 4 = 8입니다.

  2. 분자 계산하기
    각 분수의 분자에 다른 분소의 분모를 곱하고 더합니다. 예를 들어 1/2와 3/4의 경우, 분자는 1 * 4 + 3 * 2 = 10입니다.

  3. 기약 분수로 만들기
    분자와 분모의 최대 공약수를 찾아 분자와 분모를 나눕니다. 예를 들어 10 / 8의 경우, 분자와 분모의 최대 공약수는 2이므로, 분자와 분모에 2로 나누면 5/4의 값이 얻어 집니다.

분수의 덧셈 원리
분수의 덧셈 원리

 

분수의 덧셈 원리
분수의 덧셈 원리

 

풀이

Python

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def solution(numer1, denom1, numer2, denom2):
    # 두 분수의 합을 구한다.
    numer = numer1 * denom2 + numer2 * denom1
    denom = denom1 * denom2

    # 분자와 분모의 최대공약수를 구한다.
    gcd_value = gcd(numer, denom)

    # 분자와 분모를 최대공약수로 나눠 기약분수를 만든다.
    numer //= gcd_value
    denom //= gcd_value

    return [numer, denom]

gcd함수는 최대공약수 구하는 역할이고 solution은 두 분수의 합을 구하고 기약분수로 만듭니다.

 

출처

https://school.programmers.co.kr/learn/courses/30/lessons/120808

반응형
profile

IdoCleanCode

@IdoCleanCode

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!