코딩 연습

프로젝트 오일러 68번 본문

project euler with python

프로젝트 오일러 68번

코딩아저씨 2016. 3. 15. 15:35
반응형

68번 문제는 다음과 같다.


Consider the following "magic" 3-gon ring, filled with the numbers 1 to 6, and each line adding to nine.


Working clockwise, and starting from the group of three with the numerically lowest external node (4,3,2 in this example), each solution can be described uniquely. For example, the above solution can be described by the set: 4,3,2; 6,2,1; 5,1,3.

It is possible to complete the ring with four different totals: 9, 10, 11, and 12. There are eight solutions in total.

TotalSolution Set
94,2,3; 5,3,1; 6,1,2
94,3,2; 6,2,1; 5,1,3
102,3,5; 4,5,1; 6,1,3
102,5,3; 6,3,1; 4,1,5
111,4,6; 3,6,2; 5,2,4
111,6,4; 5,4,2; 3,2,6
121,5,6; 2,6,4; 3,4,5
121,6,5; 3,5,4; 2,4,6

By concatenating each group it is possible to form 9-digit strings; the maximum string for a 3-gon ring is 432621513.

Using the numbers 1 to 10, and depending on arrangements, it is possible to form 16- and 17-digit strings. What is the maximum 16-digit string for a "magic" 5-gon ring?




\(n-\rm{gon}\) 에 대해서 생각해 보자.

\(n-\rm{gon}\)은 내부의 \(n\)각형의 꼭짓점 \(n\) 개와 외부의 \(n\) 각형의 꼭짓점이 아닌 \(n\) 개의 총 \(2n\) 개의 빈칸으로 이루어져 있다. 따라서 \(n-\rm{gon}\) 을 채우는 모든 숫자는 \(1\) 부터 \(2n\) 이 되며 그 합은 \(\dfrac{2n(2n+1)}{2}=n(2n+1)\) 이 된다. 따라서 각 그룹(\(n\) 각형의 한 변을 포함하는 선분 위에 놓이게 되는 세 개의 숫자)의 합을 모두 더하면 내부의 \(n\) 각형 꼭짓점에 놓이게 되는 숫자들은 2번씩, 나머지 숫자들은 한 번씩 더해지게 된다. 따라서 각 그룹의 숫자들의 합을 모두 더하면 \[\sum \limits_{k=1}^{2n} k + \sum (꼭짓점에 \;놓인\; 수)=n(2n+1)+\sum (꼭짓점에 \;놓인\; 수)\] 가 된다.

이때 \(n\) 각형의 꼭짓점에 놓이는 숫자들의 합의 최솟값은 \[1+2+\cdots+n=\dfrac{n(n+1)}{2}\] 가 되고, 최댓값은 \[(n+1)+(n+2)+\cdots+(2n)=n^2 +\dfrac{n(n+1)}{2}=\dfrac{3n^2+n}{2}\] 가 된다.

결국 각 그룹에 속한 숫자들의 합을 모두 더한 값은 최소 \[n(2n+1)+\dfrac{n(n+1)}{2}=\dfrac{n(5n+3)}{2}\], 이고 최대 \[n(2n+1)+\dfrac{n(3n+1)}{2}=\dfrac{n(7n+3)}{2}\] 가 된다.

각 그룹의 합은 위의 값을 \(n\) 으로 나눈 값이므로 최솟값이 \(\dfrac{5n+3}{2}\), 최댓값이 \(\dfrac{7n+3}{2}\) 가 된다.


이 문제에서는 \(5-\rm{gon}\) 즉 \(n=5\) 인 경우를 물어보고 있으므로 각 그룹의 총합은 \(14\) 에서 \(19\) 의 값을 가질 수 있다. 만약  각 그룹의 합이 \(14\) 라면 모든 그룹의 합은 \(5\times 14=70\) 이 되므로 \[ 5(2 \times 5+1)+\sum (꼭짓점에 \;놓인\; 수)=70\] 에서 꼭짓점에 놓인 수들의 합이 \(15\)가 되어야 함을 알 수 있다. 즉, \(1+2+3+4+5=15\) 이므로 안쪽 꼭짓점에 놓이는 수들은 \(1, \;2,\;3,\;4,\;5\) 가 되어야 한다.  이렇게 되어야만 바깥쪽에 놓이는 수들 중 가장 작은 수가 \(6\)이 되므로 그룹의 숫자들을 이어 붙였을 때 가장 큰 수를 얻을 수 있다. (만약 \(n\) 각형의 꼭짓점에 오는 수가  \(1, \;2,\;3,\;4,\;5\)가 아니라면 바깥쪽에 오는 수 중 가장 작은 수는 \(6\) 보다 작은 숫자가 될 것이고, 그렇게 되면 그룹의 수들을 이어 붙여 만든 수의 크기가 더 작아지게 된다.)

또한 이 경우 숫자 10은 바깥 쪽 빈칸에 오게 되므로 이어 붙여 만든 수가 16자릿수가 된다.


따라서 이 문제는 안쪽 \(n\) 각형의 꼭짓점에 \(1, \;2,\;3,\;4,\;5\)의 숫자가 오고 각 그룹의 합이 \(14\) 가 되도록 바깥 쪽 숫자들을 결정해 주는 방향으로 가닥을 잡으면 된다.


반응형

'project euler with python' 카테고리의 다른 글

프로젝트 오일러 72번  (0) 2016.03.15
프로젝트 오일러 69번  (0) 2016.03.15
프로젝트 오일러 67번  (0) 2016.03.15
프로젝트 오일러 66번  (0) 2016.03.15
프로젝트 오일러 59번  (0) 2016.03.15


Comments