티스토리 뷰

알고리즘/백준

[BAEKJOON] 2559 수열

응애~ 개발자 2022. 11. 8. 14:20
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)의 시간이 걸린다.

  1.  누적합을 구한다.
  2. 최대 값을 저장한 변수를 선언한다.
  3. 다시 전체 index를 탐색하는데 자신의 index와 연속 K일 만큼 차이를 구해서 그중 큰 값을 최대 값으로 저장한다.
  4. 최대 값을 출력한다.

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
링크
«   2024/10   »
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
글 보관함