[Boj_21921] ๋ธ”๋กœ๊ทธ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

21921๋ฒˆ: ๋ธ”๋กœ๊ทธ

์ฒซ์งธ ์ค„์— $X$์ผ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด์˜จ ๋ฐฉ๋ฌธ์ž ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ 0๋ช…์ด๋ผ๋ฉด SAD๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ 0๋ช…์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋‘˜์งธ ์ค„์— ๊ธฐ๊ฐ„์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

์ฐฌ์†”์ด๋Š” ๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•œ ์ง€ ๋ฒŒ์จ N์ผ์ด ์ง€๋‚ฌ๋‹ค.

์š”์ฆ˜ ๋ฐ”๋น ์„œ ๊ด€๋ฆฌ๋ฅผ ๋ชป ํ–ˆ๋‹ค๊ฐ€ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์„ ๋ดค๋”๋‹ˆ ๋ฒŒ์จ ๋ˆ„์  ๋ฐฉ๋ฌธ ์ˆ˜๊ฐ€ 6๋งŒ์„ ๋„˜์—ˆ๋‹ค.

 

์ฐฌ์†”์ด๋Š” X์ผ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด์˜จ ๋ฐฉ๋ฌธ์ž ์ˆ˜์™€ ๊ทธ ๊ธฐ๊ฐ„๋“ค์„ ์•Œ๊ณ  ์‹ถ๋‹ค.

์ฐฌ์†”์ด๋ฅผ ๋Œ€์‹ ํ•ด์„œ X์ผ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด์˜จ ๋ฐฉ๋ฌธ์ž ์ˆ˜์™€ ๊ธฐ๊ฐ„์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ๊ตฌํ•ด์ฃผ์ž.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์ง€๋‚œ ์ผ์ˆ˜ N์™€ X๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ๋ธ”๋กœ๊ทธ ์‹œ์ž‘ 1์ผ์ฐจ๋ถ€ํ„ฐ N์ผ์ฐจ๊นŒ์ง€ ํ•˜๋ฃจ ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— X์ผ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด์˜จ ๋ฐฉ๋ฌธ์ž ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ 0๋ช…์ด๋ผ๋ฉด SAD๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋งŒ์•ฝ ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ 0๋ช…์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋‘˜์งธ ์ค„์— ๊ธฐ๊ฐ„์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

โ–ธ ์ œํ•œ

  • โ€Š1≤X≤N≤250,000
  • โ€Š0≤ ๋ฐฉ๋ฌธ์ž ์ˆ˜ ≤8,000

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅˆ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ์‹ค๋ฒ„ 3
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๋ˆ„์  ํ•ฉ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

5 3
1 4 2 5 1

์œ„์˜ ์˜ˆ์‹œ๋กœ ํ’€์ด๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

(1)

 1   4   2  5 1

1, 4, 2 ๊ตฌ๊ฐ„, sum = 7

 

(2)

1  4   2   5  1

4, 2, 5 ๊ตฌ๊ฐ„, sum = 11

 

(3)

1 4  2   5   1 

2, 5, 1 ๊ตฌ๊ฐ„, sum = 8

 

x์นธ๋งŒํผ ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์„ ์˜†์œผ๋กœ ์›€์ง์ด๋ฏ€๋กœ '์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

(1)์—์„œ์˜ ํ•ฉ์€ 7์ด์—ˆ๊ณ ,

(2)์™€ ๊ฐ™์ด ์˜†์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•  ๋•Œ๋Š” ๋น ์ง€๋Š” 1์„ ๋นผ์ฃผ๊ณ  ์ƒˆ๋กœ ๋“ค์–ด์˜ค๋Š” 5๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด ์ฃผ๋ฉด, ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์˜ ํ•ฉ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด x์ผ ๋™์•ˆ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด์˜จ ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ ๋œ๋‹ค.

 

์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž ์ˆ˜์˜€๋˜ ๊ธฐ๊ฐ„์€

ํ˜„์žฌ ์ตœ๋Œ€์น˜(๋ฐฉ๋ฌธ์ž ์ˆ˜) ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ตœ๋Œ€์น˜๋ฅผ ๊ฐฑ์‹ ํ•ด ์ฃผ๊ณ ,

ํ˜„์žฌ ์ตœ๋Œ€์น˜์™€ ๋™์ผํ•˜๋‹ค๋ฉด ๋‚ ์งœ๋ฅผ ์นด์šดํŒ… ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค.

 

๐Ÿ” ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ž€(Sliding window)?

  • ์œˆ๋„์šฐ(ํŠน์ • ๋ฒ”์œ„)๊ฐ€ ์žˆ์„ ๋•Œ, ์œˆ๋„์šฐ ๋‚ด๋ถ€ ์š”์†Œ์˜ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ์˜ ์ผ์ • ๋ฒ”์œ„์˜ ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๋‹ค.
    • ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ, ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ตฌํ•˜๊ธฐ ๋“ฑ์— ํ™œ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ”  ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์™€ ํˆฌ ํฌ์ธํ„ฐ

[ ๊ณตํ†ต์  ]

  • ์„ ํ˜• ๋ฐฐ์—ด(1์ฐจ์› ๋ฐฐ์—ด)์„ 2ํšŒ ์ด์ƒ ๋ฐ˜๋ณต์ ์œผ๋กœ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ,
  • O(N²) ์ด์ƒ ๊ฑธ๋ฆด ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜์—ฌ O(N)์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

[ ์ฐจ์ด์  ]

  • ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋Š” ๊ตฌ๊ฐ„์˜ ๊ธธ์ด๋ฅผ ๊ณ ์ •์ ์œผ๋กœ ์žก๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํ„ฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ํ•„์š”ํ•˜๋‹ค.
    • ์ฆ‰, ๊ณ ์ •์ ์ธ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํฌ์ธํ„ฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์–ด๋„ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋ฐฐ์—ด์˜ ๋์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜๋ฉด, ํˆฌ ํฌ์ธํ„ฐ๋Š” ๊ตฌ๊ฐ„์˜ ๊ธธ์ด๋ฅผ ๊ฐ€๋ณ€์ ์œผ๋กœ ์žก๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๊ฐ„์˜ ์–‘์ชฝ ๋์ด ๋˜๋Š” ํฌ์ธํ„ฐ ๋‘ ๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 38940KB
์‹œ๊ฐ„ : 308ms
import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken()); // ๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์ง€๋‚œ ์ผ์ˆ˜
        int x = Integer.parseInt(st.nextToken()); // x์ผ ๋™์•ˆ

        st = new StringTokenizer(br.readLine());
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) { // 1์ผ์ฐจ๋ถ€ํ„ฐ n์ผ์ฐจ๊นŒ์ง€ ํ•˜๋ฃจ ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์ž…๋ ฅ
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int sum = 0; // ๋ฐฉ๋ฌธ์ž์ˆ˜์˜ ํ•ฉ
        int day = 1; // x์ผ ๋™์•ˆ ๋ฐฉ๋ฌธ์ž๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์–ด์˜จ ๊ธฐ๊ฐ„
        for (int i = 0; i < x; i++) sum += arr[i]; // 1์ผ๋ถ€ํ„ฐ x์ผ๊นŒ์ง€ ๋ฐฉ๋ฌธ์ž์ˆ˜์˜ ํ•ฉ

        int max = sum; // ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž์ˆ˜
        for (int i = x; i < n; i++) {
            sum -= arr[i-x]; // ์ฒซ๋ฒˆ์งธ ์ œ์™ธ
            sum += arr[i];

            if (max < sum) { // ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž์ˆ˜ ๊ฐฑ์‹ 
                day = 0; // ๊ธฐ๊ฐ„ ์ดˆ๊ธฐํ™” ํ›„ ์ฆ๊ฐ€
                day++;
                max = sum;
            } else if (max == sum) { // ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž์ˆ˜๊ฐ€ ๊ฐ™์€ ๊ธฐ๊ฐ„์ด๋ฉด
                day++;
            }
        }

        if (max == 0) { // ์ตœ๋Œ€ ๋ฐฉ๋ฌธ์ž ์ˆ˜๊ฐ€ 0๋ช…
            bw.append("SAD" + "\n");
            bw.flush();
            return;
        }

        bw.append(max + "\n" + day);
        bw.flush();
        bw.close();
        br.close();
    }
}

 

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Boj_1238] ํŒŒํ‹ฐ  (2) 2024.03.21
[Boj_2252] ์ค„ ์„ธ์šฐ๊ธฐ  (1) 2024.01.11
[Boj_2447] ๋ณ„ ์ฐ๊ธฐ - 10  (0) 2023.11.28
[Boj_1074] Z  (1) 2023.11.28
[Boj_1992] ์ฟผ๋“œํŠธ๋ฆฌ  (1) 2023.11.28