오일러 프로젝트 08
문제
접근
문제를 잘 읽어보면 상당히 간단한 문제라는 것을 알 수 있습니다.
- 입력으로는 1000자리 숫자가 주어진다.
- 이 문자열을 한 글자씩 쪼갠 후, 정수로 만든다.
- 0, 1, 2, 3, 4 번째의 다섯 숫자의 곱을 구한다.
- 1, 2, 3, 4, 5 번째의 다섯 숫자의 곱을 구한다.
- ... 이 과정을 반복하면서 곱의 최대값을 구한다.
숫자의 리스트를 xs
라 할 때 맨 마지막 13개 숫자는 xs[987:1000]
가 될 것입니다. 따라서 0~987 구간 동안, 그 인덱스를 시작으로 하는 열세 개 숫자의 곱을 구하고, 그 곱들의 최대값을 구하면 됩니다.
다만, 1000자 짜리 문자열을 고스란히 한 줄에 쓰는 것은 예의 아닌 것 같아서 50자로 나눈 문자열을 사용하기로 합니다.
from functools import reduce
s = """
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
"""
prod = lambda xs: reduce(lambda x, y: x * y, xs)
xs = [int(x) for x in s if x.isdigit()]
print(max(prod(xs[i:i+13]) for i in range(len(xs) - 13)))