본문 바로가기
카테고리 없음

# 2559번 수열

by redcubes 2024. 3. 9.

'''
10개의 원소가 있고 3 크기의 윈도우를 슬라이딩 시킨다고 하면
0 1 2 3 4 5 6 7 8 9
|___| | | | | | | |
  |___| | | | | | |
    |___| | | | | |
      |___| | | | |
        |___| | | |
          |___| | |
            |___| |
              |___|
반복 횟수는 10 - 3 + 1 = 8회다.

최초 윈도우를 설정하는1회를 제외한 7회동안 
제일 앞과 제일 뒤의 값을 빼고 더하면 된다.
n개의 원소와 k크기의 윈도우라면 n-k회가 된다.
'''

import sys
def sliding_window_sum(arr, n, k):
    window = sum(arr[0:k])
    result = window
    for i in range(n-k):
        window = window - arr[i] + arr[i+k]
        result = max(result, window)       
    return result

if __name__ == "__main__":
    n, k = map(int, sys.stdin.readline().split())
    arr = list(map(int, sys.stdin.readline().split()))
    print(sliding_window_sum(arr, n, k))

이 문제에 다음 세 알고리즘이 관련으로 나와서 공부해 보았다.

누적합은 점점 구간이 길어지고 투 포인터는 조건에 따라 길어졌다가 짧아졌다 하며, 슬라이딩 윈도우는 구간 길이를 유지한다.

누적 합(Prefix Sum) 문제

배열에서 시작점부터 점점 긴 구간을 합하는 문제인데, 새로운 구간만 더해서 복잡도를 낮추는 개념입니다.

https://book.acmicpc.net/algorithm/prefix-sum

 

누적 합

배열의 시작 인덱스위의 설명에서 배열 $A$의 시작 인덱스는 $1$로 사용했습니다. 그 이유는 $S[l-1]$ 때문입니다. 시작 인덱스가 $1$이면 $l$의 최솟값은 $1$이고, 여기서 $l-1$은 $0$입니다. 만약, 시작

book.acmicpc.net

투 포인터(Two Pointer)

https://butter-shower.tistory.com/226

 

[Algorithm] 투포인터(Two Pointer) 알고리즘

알고리즘 문제를 풀다보면 종종 나오는 투포인터 알고리즘! 막 꼬여가지고 ㅋㅋㅋ 저도 중간에 제대로 못짜고 그러는 경우가 많은데요, 많은 코딩테스트 문제에 등장하는 것은 아니지만 잊을만

butter-shower.tistory.com

슬라이딩 윈도우(Sliding Window)

https://ji-musclecode.tistory.com/37

 

슬라이딩 윈도우 알고리즘(Sliding Window) (feat. 투 포인트)

1. 슬라이딩 윈도우 알고리즘 (Sliding Window) ( 슬라이딩 윈도우 알고리즘 간단 예제 ) 1, 2, 3, 4, 5, 6, 7 로 이루어진 숫자 배열에서 A[i] + A[i+1] + A[i+2] 형식으로 연속적인 3개의 숫자의 합의 최댓값을

ji-musclecode.tistory.com

https://celbeing.tistory.com/75

 

슬라이딩 윈도우(Sliding window)

1. 투 포인터(Two pointer)와 슬라이딩 윈도우 리스트에서 데이터에 접근할 때 한 방향으로 탐색하는 선형탐색은 매우 간단하지만 리스트의 크기가 커지게 되면 효율적이지 않다는 문제가 있다. 이

celbeing.tistory.com