Algorithm

SWEA 4835 구간합 (python)

광보기 2021. 4. 19. 14:52
반응형

4835. [파이썬 S/W 문제해결 기본] 1일차 - 구간합 D2

문제

N개의 정수가 들어있는 배열에서 이웃한 M개의 합을 계산하는 것은 디지털 필터링의 기초연산이다.

M개의 합이 가장 큰 경우와 가장 작은 경우의 차이를 출력하는 프로그램을 작성하시오.

다음은 N=5, M=3이고 5개의 숫자 1 2 3 4 5가 배열 v에 들어있는 경우이다.

v 1 2 3 4 5

이웃한 M개의 합이 가장 작은 경우 1 + 2 + 3 = 6

이웃한 M개의 합이 가장 큰 경우 3 + 4 + 5 = 12

답은 12와 6의 차인 6을 출력한다.

[입력]

첫 줄에 테스트 케이스 개수 T가 주어진다. ( 1 ≤ T ≤ 50 )

다음 줄부터 테스트케이스의 첫 줄에 정수의 개수 N과 구간의 개수 M 주어진다. ( 10 ≤ N ≤ 100, 2 ≤ M < N )

다음 줄에 N개의 정수 ai가 주어진다. ( 1 ≤ a ≤ 10000 )

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

풀이

T = int(input())

def range_sum(info,numbers):
    # 정수의 개수 N
    N = info[0]
    # 구간의 개수 M
    M = info[1]

    # 맥스 초기값 선언
    max_value = 0
    # min 초기값 선언(1)
    min_value = 0
    # min 값을 추정하기 힘들어 초기 M구간의 합을 최솟값으로 지정
    for i in range(M):
        min_value += numbers[i]

    # 구간합을 실행하기 위해 전체길에서 (M-1)만큼을 제외한 값을 지정(index 넘지 않기 위해)
    for i in range(len(numbers)-M+1):
        # 임시적인 구간합 설정
        r_sum = 0
        # M구간의 합 구하기
        for j in range(M):
            r_sum += numbers[i+j]
        # 최대값 찾기
        if r_sum>max_value:
            max_value = r_sum
        # 최소값 찾기
        if r_sum<min_value:
            min_value = r_sum

    return max_value - min_value



for tc in range(1, T+1):
    info = list(map(int, input().split()))
    numbers = list(map(int, input().split()))
    result = range_sum(info, numbers)
    print("#{} {}".format(tc,result ))
반응형