백준 코드 16430번 문제에서 '서로소'와 '기약 분수'가 나왔다.

예를 들어, 숫자 3과 5가 있을 때 각각의 공약수는 1, 3과 1, 5이다. 이 두 수의 최대공약수는 1이다. 이때 이 두 수의 관계를 '서로소'라 한다.

기약 분수는 1/2, 3/5와 같이 분자와 분모의 공약수가 1 뿐이어서 더 이상 약분할 수 없는 상태의 분수를 말한다.

만약 분수 2/4가 있을 때 이 수의 기약분수는 1/2이다.

파이썬의 math 모듈에는 gcd 함수가 있다. 주어진 두 숫자의 최대공약수를 구한다.

>>>gcd(4, 10)
2

나는 서로소를 이 함수로 검사했다.

while True:
    A, B = map(int, input().split())
    if gcd(A, B) != 1:
        print("A, B는 서로소여야 합니다.")
        continue
    elif A < 1 or B < 1 or A > 10 or B > 10:
        print("A, B는 1에서 9까지의 숫자 중 하나여야 합니다.")
        continue
    else:
        break

그리고 1 - (A / B)의 계산이 소수점으로 나오지 않고 분수로 출력되도록 Fraction으로 분수를 생성했다. 숫자 A와 B는 이미 서로소이므로 더 이상 약분할 필요가 없지만, 만약 서로소가 아닐 경우에도 Fraction 함수로 인해 자동으로 기약 분수로 약분되어 출력한다. 이후 분자와 분모를 따로 출력하기 위해 numerator 프로퍼티(분자)와 denominator 프로퍼티(분모)를 사용했다.

remain = 1 - Fraction(A, B)
print(remain.numerator, remain.denominator)

백준 코드에서 여러 문제들을 풀어보니 모르는 것들을 많이 알게 된다. 또, 검색을 통해 모르는 것을 아는 것으로 만들 수 있게 되었다. 전에는 인터넷에서 방법을 검색해도 그 말을 이해하지 못해서 해결을 못했는데, 조금씩 익숙해지니 이해가 빨라진다. 

+ Recent posts