2559 수열

DONGJIN IM·2022년 3월 7일
0

코딩 테스트

목록 보기
37/137

문제 이해

숫자 배열이 주어질 것이다.
이 배열에서 길이가 K인 연속된 숫자를 뽑을 것이다.
뽑는 경우의 수 중 뽑은 수의 합이 가장 커질 때의 합을 출력하는 문제이다.


문제 풀이

sum = A[left] + A[left + 1] + ... + A[right]일 것이다.
그리고 다음 연속된 숫자 배열의 합은 아래와 같다.
sum = A[left+1] + A[left+2] + ... + A[right] + A[right+1]

두 개의 공통점과 차이점이 하나씩 존재한다.

  1. A[left+1] ~ A[right]은 sum에 모두 포함되어 있음

  2. 이전 Search에서는 A[left]가 더해져 있지만, 현재 Search에서는 A[right+1]이 더해져 있다.

즉, index = 0 ~ K-1까지의 부분합을 구한 후, 가장 왼쪽 index(0)를 left, 가장 오른쪽 index(K-1)을 right으로 지정한다.

이후, 반복문이 한 번 수행될 때 마다 left와 right을 1씩 증가시킨다.

마지막으로, 이전 ans에 A[left-1]을 빼고, A[right]을 더해주면 끝난다.(*줄에서 1을 더했으므로)
이렇게 구한 합 중 최댓값을 답으로 저장하여 출력하면 된다.


코드

import java.io.*;
import java.util.*;

public class Main {
	
	static int N,K;
	static int[] arr;
	
	static void two_pointer() {
		int start = 0;
		int end = K-1;
		int max = Integer.MIN_VALUE; // 진짜 답. 최댓값을 저장할 공간
		
		int ans = 0; // A[0] ~ A[K-1]을 저장하는 공간
		for(int i =start;i<=end;i++) {
			ans+=arr[i];
		}
		max = ans;
		
		while(true) {
			start++;
			end++;
			
			if(end>=N) break;

			ans = ans-arr[start-1]+arr[end];
            // 이전 ans - arr[left-1] + arr[right] 과정
			max = Math.max(ans, max);
		}
		
		System.out.println(max);
	}
	
	public static void main(String[] args) {

		FastReader sc = new FastReader();

		N = sc.nextInt();
		K = sc.nextInt();
		arr = new int[N];
		
		for(int i =0;i<N;i++) arr[i] = sc.nextInt();
		
		two_pointer();
	}
	
	static class FastReader // 빠른 입력을 위한 클래스
}

결과

profile
개념부터 확실히!

0개의 댓글

관련 채용 정보