Project Euler #11
문제
In the grid below, four numbers along a diagonal line have been marked in red
The product of these numbers is .
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the grid?아래 격자에서 대각선을 따라 붉게 표시된 4개 숫자의 곱은 이다.
격자에서 같은 방향(위, 아래, 왼쪽, 오른쪽 또는 대각선)으로 인접한 4개의 숫자의 곱 중 가장 큰 값은 무엇인가?
풀이
- 문제에서 알 수 있듯이 특별한 수학적 지식은 필요 없다.(
노가다를 해라!!) - 좌에서 우(), 위에서 아래(), 왼쪽 위에서 오른쪽 아래(), 오른쪽 위에서 왼쪽 아래() 방향에 대해 계산한다.
(반대 방향도 동일하다.)
import time
from functools import reduce
grid = []
grid.append('08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08'.split())
grid.append('49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00'.split())
grid.append('81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65'.split())
grid.append('52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91'.split())
grid.append('22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80'.split())
grid.append('24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50'.split())
grid.append('32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70'.split())
grid.append('67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21'.split())
grid.append('24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72'.split())
grid.append('21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95'.split())
grid.append('78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92'.split())
grid.append('16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57'.split())
grid.append('86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58'.split())
grid.append('19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40'.split())
grid.append('04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66'.split())
grid.append('88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69'.split())
grid.append('04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36'.split())
grid.append('20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16'.split())
grid.append('20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54'.split())
grid.append('01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48'.split())
for i in range(0, grid.__len__()):
for j in range(0, grid[i].__len__()):
grid[i][j] = int(grid[i][j])
rs = 0
stime = time.time()
for i in grid:
for j in range(4, i.__len__()):
k = reduce(lambda x, y:x * y, i[j - 4:j])
if k > rs:
rs = k
for i in range(3, grid.__len__()):
for j in range(0, grid[i].__len__()):
mul = 1
for k in range(0, 4):
mul *= grid[i - k][j]
if mul > rs:
rs = mul
for i in range(3, grid.__len__()):
for j in range(3, grid[i].__len__()):
mul = 1
for k in range(0, 4):
mul *= grid[i - k][j - k]
if mul > rs:
rs = mul
for i in range(3, grid.__len__()):
for j in range(grid[i].__len__() - 4, -1, -1):
mul = 1
for k in range(0, 4):
mul *= grid[i - k][j + k]
if mul > rs:
rs = mul
print(rs)
#Run time
print("Running Time: %f" %(time.time() - stime))
후기
딱히 수학적인 지식을 필요로 하거나 하는 부분은 없다.
다만, 격자에서 사선을 추출하는 방법의 문제로 보인다.
'프로젝트 오일러' 카테고리의 다른 글
Project Euler #10 (0) | 2017.02.12 |
---|---|
Project Euler #9 (0) | 2017.02.11 |
Project Euler #8 (0) | 2017.02.10 |
Project Euler #7 (0) | 2017.02.09 |
Project Euler #6 (0) | 2017.02.08 |
댓글