티스토리 뷰
728x90
반응형
- 알고리즘 분류: 구간합, 누적합, 수학
- 난이도: Silver3
- 문제내용:
- 전체 날짜 수 N과 연속적인 날짜의 수 K와 전체 날짜를 준다.
- 연속적인 K일 온도의 합중 가장 큰것을 구해라
- 사이트 : https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
문제풀이
이번 문제는 누적합, 구간합 기본 문제이다. 개념이나 이론적인 설명은 아래에 사이트에 참조 하면된다.
https://jih3508.tistory.com/50
[알고리즘 이론] 구간합, 누적합(prefix sum)
이론 1차원 배열 누적합 누적합부터 먼저 설명하면 0번째 인덱스 부터 N 번째 인덱스까지 탐색하면서 인덱스 i일때 0번째 인덱스 부터 0번째 인덱스합을 말한다. Python array = [1, 8, 7, 4, 3, 5, 6] n = len
jih3508.tistory.com
이번 문제는 최대 데이터가 100000이고 시간이 1초라서 아래와 같이 작성하면 O(N ^ 2)이 나오기 때문에 시간 초과가 나올것이다.
N, K = map(int, input().split())
array = list(map(int, input().split()))
max_value = -100 * K
for i in range(N - K):
max_value = max(max_value, sum(array[i: i + K]))
print(max_value)
시간 초과를 피할라면 O(NlogN)이하의 시간 복잡도가 나오는데 이번 구간합 누적합의 원리를 알면 O(N)의 시간이 걸린다.
- 누적합을 구한다.
- 최대 값을 저장한 변수를 선언한다.
- 다시 전체 index를 탐색하는데 자신의 index와 연속 K일 만큼 차이를 구해서 그중 큰 값을 최대 값으로 저장한다.
- 최대 값을 출력한다.
Code
Python
N, K = map(int, input().split())
array = list(map(int, input().split()))
s = [0, array[0]]
for i in range(1, N):
s.append(array[i] + s[i])
max_value = -100 * K
for i in range( N - K + 1):
max_value = max(max_value, s[i + K] - s[i])
print(max_value)
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] array = new int[N];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
array[i] = Integer.parseInt(st.nextToken());
}
int[] s = new int[N + 1];
for(int i = 0; i < N; i++) {
s[i + 1] = s[i] + array[i];
}
int max_value = -100 * K;
for(int i = 0; i <= N - K ; i++) {
max_value = Math.max(max_value, s[i + K] - s[i]);
}
System.out.println(max_value);
}
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[BAEKJOON] 2566 최댓값 (0) | 2022.11.09 |
---|---|
[BAEKJOON] 16139 인간-컴퓨터 상호작용 (0) | 2022.11.09 |
[BAEKJOON] 2566 최댓값 (2) | 2022.11.08 |
[BAEKJOON] 11054 가장 긴 바이토닉 부분 수열 (0) | 2022.11.07 |
[BAEKJOON] 2565 전깃줄 (0) | 2022.11.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- JSCODE
- spring-boot
- DP
- 그리디
- LeetCode
- 자바
- 이론
- java
- level2
- BFS
- 백준
- 그래프
- 동적계획법
- BaekJoon
- 동적 계획법
- Greedy
- 문자열
- Programmerse
- 넓이 우선 탐색
- Python
- 수학
- 백트레킹
- 구현
- DFS
- 알고리즘
- 누적합
- 조합
- 배열
- 재귀호출
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함