{프로젝트 오일러/Project Euler} 8. 이어진 수의 곱의 최댓값
알고리즘 공부/프로젝트 오일러(Project Euler)

{프로젝트 오일러/Project Euler} 8. 이어진 수의 곱의 최댓값

한국어/Hackerrank - 한국어 버전과 문제가 다를 수 있습니다. 채점은 Hackerrank를 추천합니다.

1 <= 입력 개수 <= 100, 1 <= K <= 7 <= N <= 1000

from operator import mul
from functools import reduce
for _ in range(int(input())):
    n, k = map(int, input().split())
    num = list(map(int, input()))
    ans = 0
    for i in range(n-k+1):
        ans = max(ans, reduce(mul, num[i:i+k]))
    print(ans)
# from math import prod
# prod == reduce(mul, [iterator])
# ans = max(ans, prod(num[i:i+k]))

이 문제는 정수 n과 k가 주어지고 길이가 n인 정수 num이 주어집니다.

이때, num안의 이어진 k개의 수에서 각 자릿수를 곱한 것 중 최댓값을 구하는 문제입니다.

만약 n = 6, k = 3, num = 132458이면 132, 324, 245, 458이 이어진 k개의 수들이고 각각의 곱은 6, 24, 40, 160이므로 답은 160입니다.(1*3*2=6, 3*2*4=24, 2*4*5=40, 4*5*8=160)

그래서 코드는 매우 간단히 인덱스 0부터 인덱스 n-k까지 돌면서 각 자릿수의 곱을 구하고 현재 최댓값과 비교하면서 구하면 됩니다.

mul 함수는 lambda x, y: x*y와 같으며 reduce는 함수와 이터러블을 인자로 받으며 [1, 2, 3, 4]라는 리스트가 있으면 (1,2), (앞의 결과, 3), (앞의 결과, 4)를 반환합니다.

즉, (1, 2) = 1*2 = 2, (앞의 결과 2, 3) = 2*3 = 6, (앞의 결과 6, 4) = 6*4 = 24, 24를 반환하는 것입니다.

그런데 이터러블의 곱을 구한다면 파이썬 3.8부터 math 라이브러리의 prod함수를 사용하면 됩니다.

(그런데 쓰지 않은 이유는 Hackerrank는 파이썬 버전이 3.7이어서 prod함수가 없기 때문에 위와 같이 작성하였습니다.)