09
27

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


์˜ค๋‹ต๋…ธํŠธ(ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ )

๋ˆ„์ ํ•ฉ ๋ฌธ์ œ๋‹ค. 

์ฒ˜์Œ์— ๊ณ ๋ ค์•ˆํ•œ ๋ถ€๋ถ„์€ ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด ์‹œ์ž‘ ์ธ๋ฑ์Šค ๋ถ€๋ถ„์ด๋‹ค.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, gap;

    public static void main(String[] args) throws Exception {
        //System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        gap = Integer.parseInt(st.nextToken());
        int[] in = new int[n];
        int[] prefix = new int[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            in[i] = Integer.parseInt(st.nextToken());
            if (i == 0) {
                prefix[i] = in[i];
            } else {
                // ๋ˆ„์ ํ•ฉ
                prefix[i] = prefix[i - 1] + in[i];
            }
        }
        PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
            return o2 - o1;
        });
        //์ด์ œ ๊ฐ ๊ฐ„๊ฒฉ์˜ ํ•ฉ์„ pq์— ๋„ฃ๊ธฐ
        int idx = n - 1;
        while (true) {
            if (idx - gap < 0) break;
//            System.out.println(prefix[idx] + ", " + prefix[idx - gap]);
            pq.add(prefix[idx] - prefix[idx - gap]);
            idx--;
        }

        System.out.println(pq.poll());
    }
}

์ด๋ ‡๊ฒŒ ํ•ด๋ฒ„๋ฆฌ๋ฉด ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ƒ๋ฉด 

10 3
100 -1 -1 -1 -1 -1 -1 -1 -1 -1

์ด ์ž…๋ ฅ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด์—๋Š” ๋‹ค ๋“ค์–ด๊ฐ€์ง€๋งŒ, ๊ฐ„๊ฒฉ์„ ๋”ํ•  ๋•Œ 98์ด ์ตœ๋Œ€๊ฐ’์ด ์•„๋‹ˆ๋ผ 3์ด ์ตœ๋Œ€๊ฐ’์ด ๋‚˜์™€๋ฒ„๋ฆฐ๋‹ค.

[100, 99, 98, 97, 96, 95, 94, 93, 92, 91]

์ด๊ฒŒ size๊ฐ€ n์ธ prefix์ธ๋ฐ, ๋‚ด ๋กœ์ง ์ƒ `n`๋ฒˆ์งธ - `n-k`๋ฒˆ์งธ ๋ˆ„์ ํ•ฉ ํ•ญ๋ชฉ์„ ๋นผ๋ฉด ๊ทธ ์‚ฌ์ด์˜ ๋ˆ„์ ํ•ฉ์ด ๋‚˜์˜ค๋„๋ก ๋˜์–ด์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ -3์ด ๋‚˜์˜ค๊ฒŒ ๋˜๊ณ , ์›๋ž˜๋ผ๋ฉด 100, -1, -1 ์ด ์„ธ ์ˆ˜์˜ ํ•ฉ์ด 98์ธ๋ฐ, ์‹œ์ž‘ ํ•ญ๋ชฉ์„ ๊ฐ„๊ฒฉ์œผ๋กœ ์žก๊ณ  ๊ฐ€๋ฒ„๋ฆฐ ์…ˆ์ด ๋ผ์„œ -3์ด ๋‚˜์˜ค๊ฒŒ ๋๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ์ž‘ ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜๋ฉด n+1 ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ prefix ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด์ด ๊ตฌ์„ฑ๋œ๋‹ค.

prefix ๋ฐฐ์—ด ๊ตฌ์„ฑํ•  ๋•Œ๋Š” ๊ทธ๋ž˜์„œ 1์นธ ๋” ํฌ๊ฒŒ ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. DP๋ž‘ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค.

[0, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91]

 

๋น„์Šทํ•œ ๋ฌธ์ œ๋กœ ์—ฐ์†ํ•ฉ์ด ์žˆ๋‹ค.

๋ช‡ ๋ฒˆ ์—ฐ์†ํ•ด๋„ ์ข‹์œผ๋‹ˆ๊นŒ ์—ฐ์†ํ•œ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

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

์—ฌ๊ธฐ์„œ ๋– ์˜ฌ๋ฆฐ ์•„์ด๋””์–ด๋Š” ์–ด์ฐจํ”ผ ๋ˆ„์ ํ•ด์„œ ํ•ฉํ•˜๋Š”๋ฐ, ๊ฐ’์ด ์ž‘์•„์ง€๋Š” ๊ฒฝ์šฐ์—๋Š” ๋”ํ•˜์ง€ ์•Š๊ณ  ๊ฐ€๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

for (int i = 0; i < n; i++) {
    in[i] = Integer.parseInt(st.nextToken());
}
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
    return o2 - o1;
});
for (int i = 1; i <= n; i++) {
    prefix[i] = Math.max(prefix[i-1]+in[i-1], in[i-1]);
    pq.add(prefix[i]);
}

์ด๋Ÿฌ๋ฉด ๊ฐ’์ด ์ฃผ์–ด์ง„ ์ž…๋ ฅ ๋ฐฐ์—ด๋ณด๋‹ค ์ž‘์€ ๋ˆ„์ ํ•ฉ ์œ„์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋ˆ„์ ํ•ฉ ๊ฐ’์— ์ด์ „ ์—ฐ์†ํ•ฉ์„ ๋ฌด์‹œํ•˜๊ณ , ์ƒˆ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

์ผ์ข…์˜ DP๋ผ๊ณ  ๋ณผ์ˆ˜๋„ ์žˆ์ง€์•Š์„๊นŒ?

 

์ข€ ๋” ๋‚œ์ด๋„์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ๋ˆ„์ ํ•ฉ์„ 2๋ฒˆ์“ฐ๋Š” ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ดค๋‹ค.

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

๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ์–ด์•ผํ•œ๋‹ค. ์„ ๋ถ„ ์‹œ์ž‘์ ์„ ์ฃผ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        // System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int n = Integer.parseInt(st.nextToken());
        int maxH = -1;
        int maxIdx = -1;
        int[] input = new int[10001];

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int idx = Integer.parseInt(st.nextToken()); // ๊ธฐ๋‘ฅ ์™ผ์ชฝ๋ฉด์˜ ์œ„์น˜
            int h = Integer.parseInt(st.nextToken());
            input[idx + 1] = h; // idx ์ž์ฒด๋Š” 0์ด ์—†์œผ๋‚˜, 0-1 ,1-2 ์ด๋ ‡๊ฒŒ ๊ฐ„๊ฒฉ์œผ๋กœ ๋“ค์–ด๊ฐ -> ์ •ํ™•ํžˆ๋Š” ์™ผ์ชฝ ๋ชจ์„œ๋ฆฌ ๊ธฐ์ค€์ด๋‹ˆ๊นŒ ํ•˜๋‚˜์”ฉ ๋ฐ€๊ธฐ
            maxIdx = Math.max(idx, maxIdx);
            maxH = Math.max(h, maxH);
        }


        int[] pref = new int[maxIdx + 2]; // ์•ž๋’ค์— ํ•œ์นธ์”ฉ ์ถ”๊ฐ€ํ•˜๊ธฐ
        int[] suff = new int[maxIdx + 2]; // ์•ž๋’ค์— ํ•œ์นธ์”ฉ ์ถ”๊ฐ€ํ•˜๊ธฐ
        int[] maxPoint = new int[2]; //
        Arrays.fill(maxPoint, -1);
        int prev = 0;
        int prefSum = -1;
        int suffSum = -1;
        // l to r
        for (int i = 1; i <= maxIdx + 1; i++) {
            prev = Math.max(input[i], prev);
            pref[i] = pref[i - 1] + prev;
            if (input[i] == maxH) {
                maxPoint[0] = i;
                break;
            }
        }
        prev = 0;
        for (int i = maxIdx + 1; i >= 0; i--) {
            prev = Math.max(input[i], prev);
            suff[i - 1] = suff[i] + prev;
            if (input[i] == maxH) {
                maxPoint[1] = i;
                break;
            }
        }
        // max๊นŒ์ง€ ํ•ฉ
        int maxLToR = -1;
        int maxRToL = -1;
        for (int i = 0; i < maxPoint[0]; i++) {
            maxLToR = Math.max(maxLToR, pref[i]);
        }
        for (int i = maxIdx + 1; i >= maxPoint[1]; i--) {
            maxRToL = Math.max(maxRToL, suff[i]);
        }
//        System.out.println(maxLToR + ", " + maxRToL);

        // ํ•ฉ์น˜๊ธฐ

        int maxWidth = maxPoint[1] - maxPoint[0] + 1;

//
//        System.out.println(Arrays.toString(pref) + ", " + maxPoint[0] + ", " + maxH);
//        System.out.println(Arrays.toString(suff) + ", " + maxPoint[1] + ", " + maxH);
        System.out.println(maxLToR + maxRToL + maxWidth * maxH);
    }
}

์™„์ „ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์•„๋ž˜ ๋ฌธ์ œ๋„ ํ’€์ˆ˜์žˆ๋‹ค.

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

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int H = Integer.parseInt(st.nextToken());
        int W = Integer.parseInt(st.nextToken());

        int[] heights = new int[W];
        st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < W; i++) {
            heights[i] = Integer.parseInt(st.nextToken());
        }

        int[] leftMax = new int[W]; // ์–˜๋„ค๊ฐ€ ์ฐฝ๊ณ ๋‹ค๊ฐํ˜•์— ์žˆ๋˜ prefix, suffix ์—ญํ• 
        int[] rightMax = new int[W];

        // ์™ผ์ชฝ์—์„œ ๋ณธ ์ตœ๋Œ€ ๋†’์ด ๊ณ„์‚ฐ
        leftMax[0] = heights[0];
        for (int i = 1; i < W; i++) {
            leftMax[i] = Math.max(leftMax[i - 1], heights[i]);
        }

        // ์˜ค๋ฅธ์ชฝ์—์„œ ๋ณธ ์ตœ๋Œ€ ๋†’์ด ๊ณ„์‚ฐ
        rightMax[W - 1] = heights[W - 1];
        for (int i = W - 2; i >= 0; i--) {
            rightMax[i] = Math.max(rightMax[i + 1], heights[i]);
        }

        // ๋น—๋ฌผ์ด ๊ณ ์ผ ์ˆ˜ ์žˆ๋Š” ์–‘ ๊ณ„์‚ฐ
        int water = 0;
        for (int i = 0; i < W; i++) {
            int minHeight = Math.min(leftMax[i], rightMax[i]);
            if (minHeight > heights[i]) {
                water += minHeight - heights[i];
            }
        }

        System.out.println(water);
    }
}

์ •๋‹ต์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, gap;

    public static void main(String[] args) throws Exception {
        System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        gap = Integer.parseInt(st.nextToken());
        int[] in = new int[n];
        int[] prefix = new int[n+1];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            in[i] = Integer.parseInt(st.nextToken());
            prefix[i+1] = prefix[i] + in[i];
        }
        System.out.println(Arrays.toString(prefix));

        PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
            return o2 - o1;
        });
        //์ด์ œ ๊ฐ ๊ฐ„๊ฒฉ์˜ ํ•ฉ์„ pq์— ๋„ฃ๊ธฐ
        int idx = n;
        while (true) {
            if (idx - gap < 0) break;
            pq.add(prefix[idx] - prefix[idx - gap]);
            idx--;
        }

        System.out.println(pq.poll());
    }
}
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n;

    public static void main(String[] args) throws Exception {
        // System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        int[] in = new int[n];
        int[] prefix = new int[n + 1];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            in[i] = Integer.parseInt(st.nextToken());
        }
        PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> {
            return o2 - o1;
        });
        for (int i = 1; i <= n; i++) {
            prefix[i] = Math.max(prefix[i-1]+in[i-1], in[i-1]);
            pq.add(prefix[i]);
        }
//        System.out.println(Arrays.toString(prefix));
        
        System.out.println(pq.poll());
    }
}
๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT