한국어/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함수가 없기 때문에 위와 같이 작성하였습니다.)
'알고리즘 공부 > 프로젝트 오일러(Project Euler)' 카테고리의 다른 글
{프로젝트 오일러/Project Euler} 10. 소수들의 합 (0) | 2021.01.06 |
---|---|
{프로젝트 오일러/Project Euler} 9. 특별한 피타고라스 수 (0) | 2021.01.05 |
{프로젝트 오일러/Project Euler} 7. 10001번째 소수 (0) | 2021.01.03 |
{프로젝트 오일러/Project Euler} 6. 제곱의 합과 합의 제곱의 차 (0) | 2021.01.03 |
{프로젝트 오일러/Project Euler} 5. 1~ N으로 나누어 떨어지는 수 (0) | 2021.01.02 |