🟦/백준

[실버 3] 수열

진뚱이용 2023. 2. 7. 20:41

https://www.acmicpc.net/problem/2559

 

2559번: 수열

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기

www.acmicpc.net

풀기 전:

쉬워 보이는데?

K가 4라면 0123 1234 배열 하나 새로 만들고

앞 빼주고 뒤 빼주는 투 포인터 쓰면 되겠네

 

N은 2 이상 100,000 이하이다. 

제한 시간 1초니까

N^2는 100억

N^2로 풀면 안 된다

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

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        int N, K;
        int[] array;

        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        array = new int[N];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++)
            array[i] = Integer.parseInt(st.nextToken());

무난하게 입력 받고

        int sum = 0;
        for (int i = 0; i <= K - 1; i++)
            sum += array[i];

        int max = sum;
        int point1 = 0;
        int point2 = K;

        for (; point2 < N; point2++) {
            sum -= array[point1];
            sum += array[point2];

            if (max < sum)
                max= sum;

            point1++;
        }

        sb.append(max);
        System.out.println(sb);
    }
}

첫 부분 합 구해주고 그걸 max로 설정

포인터 이동시키면서 비교 후 max 출력

 

O(N)