문제 출처 : https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
문제
설명
가장 직감적으로 떠오르는 방법으로 구현을 했습니다만, 만약 N의 범위가 훨씬 커진다면 시간초과가 날 수 있는 코드입니다.
'Sliding Window'라는 기법을 이용한다면, window를 한칸씩 밀면서 공통되는 부분을 재사용하고 새롭게 빼지고 더해지는 원소만 계산함으로써 효율적으로 답을 구할 수 있습니다. 이와 관련된 코드는 제가 추후에 게시물을 올리면 밑에 링크 걸어두겠습니다!
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ2599_Sequence {
public static void main(String[] args) throws Exception {
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[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(st.nextToken());
} //입력 완료
int start=0;
int sum = 0;
int max = Integer.MIN_VALUE;
for(int i=0; i<N-K+1; i++) { //총 N-K+1번만큼 온도의 합이 계산됨
for(int j=start; j<start+K; j++) { //연속 날짜의 수만큼 덧셈 연산
sum+=arr[j];
}
max = Math.max(max, sum); //max값 업데이트
start++; //start point 증가
sum=0; //초기화!
}
System.out.println(max);
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준][JAVA] 10026 - 적록색약 (0) | 2021.10.17 |
---|---|
[백준][JAVA] 12927 - 배수 스위치 (0) | 2021.10.17 |
[백준][JAVA] 2304 - 창고 다각형 (0) | 2021.10.10 |
[백준][JAVA] 2578 - 빙고 (0) | 2021.10.10 |
[백준][JAVA] 2564 - 경비원 (0) | 2021.10.05 |