1 분 소요



https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do



🔍 문제 풀이

알고리즘 선택

두 가지 방식으로 풀이할 수 있다.

방식 연산 방법 시간복잡도
브루트포스 매번 M개를 새로 더함 O(N×M)
슬라이딩 윈도우 앞 빼고 뒤만 더함 O(N)
  • 브루트포스는 모든 구간을 처음부터 다시 더해서 확인함
  • 슬라이딩 윈도우는 이전 구간합에서 앞 빼고, 뒤 더해서 한 칸씩 이동하여 계산


문제 도식화

구간합



💻 전체 코드

브루트포스

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

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());
        for(int tc=1; tc<=t; tc++){

            StringBuilder sb = new StringBuilder();

            StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            int arr[] = new int[n];

            st = new StringTokenizer(br.readLine());
            for(int i=0; i<n; i++){
                arr[i] = Integer.parseInt(st.nextToken());
            }
            int minSum = Integer.MAX_VALUE;
            int maxSum = Integer.MIN_VALUE;

            for(int i=0; i<= n-m; i++){
                int sum = 0;
                for(int j = i; j <= i+m-1; j++){
                    sum += arr[j];
                }
                minSum = Math.min(minSum, sum);
                maxSum = Math.max(maxSum, sum);
            }

            sb.append(maxSum-minSum);

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


슬라이딩 윈도우

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

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());
        for(int tc=1; tc<=t; tc++){

            StringBuilder sb = new StringBuilder();

            StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            int arr[] = new int[n];

            st = new StringTokenizer(br.readLine());
            for(int i=0; i<n; i++){
                arr[i] = Integer.parseInt(st.nextToken());
            }
            int sum = 0;
            for (int i = 0; i < m; i++) {
                sum += arr[i];  // 초기 구간합
            }

            int minSum = sum;
            int maxSum = sum;

            for (int i = m; i < n; i++) {
                sum = sum - arr[i - m] + arr[i];  // 앞 빼고, 뒤 더함
                minSum = Math.min(minSum, sum);
                maxSum = Math.max(maxSum, sum);
            }

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


카테고리:

업데이트:

댓글남기기