[Silver III] 수열 - 2559
성능 요약
메모리: 39572 KB, 시간: 128 ms
분류
누적 합(prefix_sum), 슬라이딩 윈도우(sliding_window), 두 포인터(two_pointer)
문제 설명
매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다.
예를 들어, 아래와 같이 10일 간의 온도가 주어졌을 때,
3 -2 -4 -9 0 3 7 13 8 -3
모든 연속적인 이틀간의 온도의 합은 아래와 같다.
이때, 온도의 합이 가장 큰 값은 21이다.
또 다른 예로 위와 같은 온도가 주어졌을 때, 모든 연속적인 5일 간의 온도의 합은 아래와 같으며,
이때, 온도의 합이 가장 큰 값은 31이다.
매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기 위한 연속적인 날짜의 수이다. K는 1과 N 사이의 정수이다. 둘째 줄에는 매일 측정한 온도를 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -100 이상 100 이하이다.
출력
첫째 줄에는 입력되는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력한다.
굉장히 간단한 문제인데 시간초과가 떠서 시간을 꽤나 소모했다.
그 이유는 원래 array를 하나씩 방문하여 슬라이싱을 통해 합을 구하여 최댓값을 출력해서 그렇다.
그러면 거의 n^2에 가까운 시간을 소모해서 그런 것 같다.
해결책을 생각하다가 규칙을 찾아봤는데, 하나씩 방문할 때마다 이전에 방문한 곳은 빼주고 후에 방문해야할 곳을 더하면 해결이 가능했다.
'알고리즘' 카테고리의 다른 글
[Gold IV] 드래곤 앤 던전 - 16434 (구현, 이분탐색) (0) | 2022.07.17 |
---|---|
[Silver III] 예산 - 2512 (이분탐색) (1) | 2022.07.16 |
[Silver I] 정수 삼각형 - 1932(dp) (1) | 2022.07.14 |
[Gold V] AC - 5430 (구현,문자열) (1) | 2022.07.13 |
[Gold IV] 우체국 - 2141(정렬,그리디) (1) | 2022.07.11 |