배열이 주어졌을 때, 파이썬의 itertools.accumulate() 함수를 활용하면 접두사 합(prefix sum), 즉 누적 합 배열을 아주 간단하게 만들 수 있습니다. 이 글에서는 accumulate() 함수의 동작 원리와 함께 실제 예제 코드를 통해 접두사 합 배열을 구하는 방법을 살펴보겠습니다.
accumulate() 함수란?
itertools 모듈의 accumulate(iterable[, func]) 함수는 반복 가능한 객체(iterable)의 요소들을 순서대로 누적 계산하는 반복자(iterator)를 생성해 반환합니다. 기본 동작은 각 위치까지의 누적 합(running total)을 계산하는 것이며, 요소는 Decimal이나 Fraction을 포함해 덧셈이 가능한 모든 타입이 될 수 있습니다.
또한 선택적으로 두 개의 인수를 받는 함수를 전달할 수 있는데, 이 경우 덧셈 대신 해당 함수가 누적 연산에 사용됩니다. 참고로 itertools 모듈의 함수들은 모두 반복자를 생성하고 반환하기 때문에, 스트림을 소진하는 방식(함수 호출이나 루프 등)으로만 접근해야 한다는 점에 유의해야 합니다.
동작 예시
입력 Data = [1, 0, 2, 3, 5] >>> list(accumulate(data)) # 누적 합 계산 출력 [1, 1, 3, 6, 11]
위 결과를 단계별로 보면 다음과 같습니다.
첫 번째 요소: 1
두 번째 요소: 1 + 0 = 1
세 번째 요소: 1 + 2 = 3
네 번째 요소: 3 + 3 = 6
다섯 번째 요소: 6 + 5 = 11
알고리즘
1단계: 리스트를 생성한다. 2단계: list(accumulate()) 함수를 사용해 누적 합을 계산한다. 3단계: 계산된 결과를 화면에 출력한다.
예제 코드
# accumulate 함수를 사용해 접두사 합 배열을 출력하는 파이썬 프로그램
from itertools import accumulate
def summation(A):
print("The List after Summation ::>", list(accumulate(A)))
# 드라이버 프로그램
if __name__ == "__main__":
A = list()
n = int(input("Enter the size of the First List ::"))
print("Enter the Element of First List ::")
for i in range(int(n)):
k = int(input(""))
A.append(k)
summation(A)
실행 결과
Enter the size of the First List ::5 Enter the Element of First List :: 1 2 3 4 5 The List after Summation ::> [1, 3, 6, 10, 15]
위 실행 결과에서 볼 수 있듯이, 사용자가 입력한 5개의 요소 [1, 2, 3, 4, 5]에 대해 accumulate() 함수는 각 위치까지의 누적 합인 [1, 3, 6, 10, 15]를 반환합니다. 이처럼 itertools.accumulate()를 사용하면 별도의 반복문 없이도 접두사 합 배열을 한 줄로 손쉽게 구할 수 있습니다.