๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/DP

[๋ฐฑ์ค€]10211๋ฒˆ: Maximum Subarray

by syLim___ 2023. 10. 18.
728x90

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

 

10211๋ฒˆ: Maximum Subarray

ํฌ๊ธฐ N์ธ ์ •์ˆ˜ํ˜• ๋ฐฐ์—ด X๊ฐ€ ์žˆ์„ ๋•Œ, X์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด(X์˜ ์—ฐ์†ํ•œ ์ผ๋ถ€๋ถ„) ์ค‘ ๊ฐ ์›์†Œ์˜ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ฐพ๋Š” Maximum subarray problem(์ตœ๋Œ€ ๋ถ€๋ถ„๋ฐฐ์—ด ๋ฌธ์ œ)์€ ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋งค์šฐ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ

www.acmicpc.net


๐Ÿฅ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ๋ฌธ์ œ๋ฅผ ๋ณด์ž๋งˆ์ž DP๊ฐ€ ๋– ์˜ฌ๋ผ์„œ DP ํ’€์–ด๋ณด์•˜๋‹ค.

 

 - ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ํ•ฉ์„ ์ €์žฅํ•  dp๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.

 - dp[0] = arr[0]์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

 

 - dp[1] ~ dp[n]๊นŒ์ง€ ์ฑ„์šด๋‹ค

 

 - ๋งค ์ธ๋ฑ์Šค๋งˆ๋‹ค ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์ƒ๊ธด๋‹ค.

 1) ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ ํ•ฉ(dp[i-1])์— ํ˜„์žฌ๊ฐ’(arr[i])์„ ๋”ํ•˜๊ฑฐ๋‚˜(์ฆ‰, ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ๋กœ์„œ ํ˜„์žฌ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜)

 2) ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ํ•ฉ์„ ๋ฒ„๋ฆฌ๊ณ , ํ˜„์žฌ๊ฐ’(arr[i])์„ ์‹œ์ž‘์œผ๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ถ€๋ถ„๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ฑฐ๋‚˜

 - ์ผ๋ฐ˜ํ•ญ์œผ๋กœ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด
 1 ) dp[i] = dp[i-1] + arr[i]
 2 ) dp[i] = arr[i]

 - Maximum Subarray๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ ์ด ์ค‘์—์„œ ํฐ ๊ฐ’์„ ๊ณ ๋ฅด๋ฉด ๋œ๋‹น.

 

 - dp ๋ฐฐ์—ด ์ค‘ ์ตœ๋Œ€๊ฐ’์ด ์ •๋‹ต์ด๋‹ค.

 

๐Ÿฅ Java ์ •๋‹ต ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(reader.readLine());

        for (int t=0; t<T; t++){
        
        	// ์ž…๋ ฅ๋ฐ›๊ธฐ
            int n = Integer.parseInt(reader.readLine());
            String[] strArr = reader.readLine().split(" ");

            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = Integer.parseInt(strArr[i]);
            }

			// dp๋ฐฐ์—ด ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”
            int[] dp = new int[arr.length];
            dp[0] = arr[0];
            
            // dp๋ฐฐ์—ด ์ฑ„์šฐ๊ธฐ
            for(int i=1; i<arr.length; i++){
                dp[i] = Math.max(arr[i]+dp[i-1], arr[i]);
            }
        
        	// ์ตœ๋Œ€ ํ•ฉ ๊ตฌํ•˜๊ธฐ
            int answer = dp[0];
            for(int i=1; i<arr.length; i++){
                answer = Math.max(answer, dp[i]);
            }
			
            // ๊ฒฐ๊ณผ์ถœ๋ ฅ
            System.out.println(answer);

        }
    }
}

 

 

๐Ÿฅ Kandane's Algorithm

 

 - ์ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์ด๊ฑธ๋กœ๋„ ์ฝ”๋“œ๋ฅผ ์งœ๋ดค๋‹ค.

 - sum์„ ์ „๋ถ€ ๊ตฌํ•˜๊ณ  ๋‚˜์„œ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋•Œ๊ทธ๋•Œ ๊ฐฑ์‹ ํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ๊ฐ„๊ฒฐํ•ด์กŒ๋‹ค

 - dp๋ž‘ ๊ฑฐ์˜ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ์กฐ๊ธˆ ๋” ์ง๊ด€์ ์ธ๋“ฏ..?

 

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            int T = Integer.parseInt(reader.readLine());

            for (int t=0; t<T; t++){
                int n = Integer.parseInt(reader.readLine());
                String[] strArr = reader.readLine().split(" ");

                int[] arr = new int[n];
                for (int i = 0; i < n; i++) {
                    arr[i] = Integer.parseInt(strArr[i]);
                }

                int answer = -Integer.MAX_VALUE;
                int currentSum = 0;
                for(int i : arr){
                  currentSum = Math.max(currentSum + i, i);
                  answer = Math.max(answer, currentSum);
                }

                System.out.println(answer);

            }
        }
  }

 

 

์œ„ - Kandane's Algorithm

์•„๋ž˜ - DP

728x90