오일러 프로젝트 71

오일러 프로젝트 71 번 문제는 약간 쉬어가는 문제인지 이전의 몇 개 문제보다는 조금 쉽다. 바로 3/7 바로 앞에 오는 분모 백만 이하의 기약진분수를 찾는 문제이다.

n과 d가 양의 정수이고 n < d 인 분수 n/d을 GCD(n, d) =  1 일 때 기약 진분수라고 부르기로 합니다. d <= 8 인 기약 진분수들을 커지는 순으로 늘어놓으면 다음과 같습니다.

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8

위에서 보듯이 3/7 바로 앞에는 2/5가 오게됩니다. d < 1,000,000 인 기약 진분수들을 커지는 순으로 늘어놓았을 때, 3/7 바로 앞에 오는 수의 분자는 얼마입니까?

접근

일일이 찾아내는 것은 답이 없다. 우리가 알고 싶은 것은 3/7보다 아주 근소하게 작은 기약 진분수이다. 만약 3/7 근처에 있는 기약 진분수의 집합 Q가 있다고 가정하자. 이들 값들은 모두 “거의 3/7″일 것이다. 그렇다면 3/7과의 거리가 짧으려면 분모가 크면 된다. 따라서 3/7을 넘지않으면서 가장 큰 분모를 가지는 분자/분모가 이에 근접할 가능성이 크다. (왜냐하면 분모의 크기가 한정되어 있기 때문에 무한정 늘어날 수는 없기 때문이다.)
예를 들어 9999에 대해서 생각해보자. 사실 어떤 임의의 수도 상관없다.

\frac{3}{7} = \frac{9999 \cdot 3}{9999 \cdot 7}  = \frac{29997}{69993}

그런데 이 값은 기약 진분수가 아니다. 분모분자는 9999라는 거대한 공약수를 가지고 있기 때문에 3/7로 약분된다. 하지만 우리가 관심있는 값은 3/7을 넘지 않으면서 약분이 되지 않을 값이다.

\frac{3}{7} > \frac{9999 \cdot 3 \div 7}{9999}  = \frac{4285}{9999}

이 값은 3/7에 매우 가까운 기약분수이다. 그리고 9999보다 큰 수를 사용하면 사용할 수록 분자와 분모값은 커질 것이고, 기약 분수의 특성상 분자와 분모가 함께 커지면 그 값은 커지고, 따라서 3/7에 더 가까운 수가 된다.
결국 답은 (999,999 * 3) / 7 이 된다.

풀이

코드가 필요 없는 문제이긴 한데, 굳이 검증해보고 싶다면 다음과 같이 쓸 수 있다.

/// Swift
print((1...999_999).filter{ $0 % 7 != 0 }.map{ 3 * $0 / 7}.max()!)
/// Python :: 백만개 분수를 만들어서 가장 큰 값의 분자를 출력한다.
from fractions import Fraction
print(max(Fraction(x*3//7, x) for x in range(1, 1000000)).numerator)

다른 접근

분모가 N이하인 0~1 사이의 기약 진분수의 집합을 페어리 수열이라 한다.

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop