[๋ฐฑ์ค€/Java] 10350 : Banks

๋ฅ˜ํƒœํ˜ธยท2026๋…„ 4์›” 27์ผ

๋ฐฑ์ค€ ํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
26/26

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

  • ๋ฒˆํ˜ธ: 10350
  • ์ œ๋ชฉ: Banks
  • ๋‚œ์ด๋„: Ruby 5
  • ๋ถ„๋ฅ˜: ์ˆ˜ํ•™, ์• ๋“œ ํ˜น, ๋ˆ„์  ํ•ฉ, ๋ถˆ๋ณ€๋Ÿ‰ ์ฐพ๊ธฐ

๐Ÿ’ก ์ ‘๊ทผ ๋ฐฉ์‹

๋ฐฑ์ค€ ์„œ๋ฒ„ ์ข…๋ฃŒ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฃจ๋น„ ๋ฌธ์ œ ํ•œ ๋ฒˆ์€ ํ’€์–ด๋ณด๊ณ  ์‹ถ์–ด์„œ ๋„์ „. ๋งˆ๋ฒ• ์ด์ฒด๊ฐ€ "์Œ์ˆ˜๋งŒํผ ๊ฐ€์ ธ์™€ ๋‹ค์‹œ ๋ถ„๋ฐฐ"ํ•˜๋Š” ๊ตฌ์กฐ๋ผ ์ „์ฒด ํ•ฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ถˆ๋ณ€๋Ÿ‰๋ถ€ํ„ฐ ์žก๊ณ  ์‹œ์ž‘. ์ˆ˜์‹๋งŒ์œผ๋กœ๋Š” ์•ˆ ํ’€๋ ค์„œ ์ž‘์€ ์ผ€์ด์Šค BFS๋กœ ์ •๋‹ต์„ ๊ตฌํ•ด๋†“๊ณ , ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ๋ˆ„์ ํ•ฉ๊ณผ ์ •๋‹ต ์‚ฌ์ด์˜ ํŒจํ„ด์„ ๋…ธ๊ฐ€๋‹ค๋กœ ๋งค์นญํ•œ ๋์— "๊ฐ ์‹œ์ž‘์  i์—์„œ ์Œ์ˆ˜ ๋ถ€๋ถ„ํ•ฉ๋งˆ๋‹ค โŒˆ|PS| / TโŒ‰๋ฅผ ๋”ํ•œ๋‹ค"๋Š” ๊ทœ์น™์„ ๋ฐœ๊ฒฌ


๐Ÿ”น ๋‹จ๊ณ„๋ณ„ ํ’€์ด

1๋‹จ๊ณ„ โ€“ ๋ถˆ๋ณ€๋Ÿ‰: ์ „์ฒด ํ•ฉ์€ ๋ณด์กด๋จ

ki = -x (x > 0)์—์„œ ๋งˆ๋ฒ• ์ด์ฒด 1ํšŒ ํ›„

ki  : -x โ†’ +x         (๋ณ€ํ™”๋Ÿ‰ +2x)
์ด์›ƒ: ๊ฐ๊ฐ -x          (๋ณ€ํ™”๋Ÿ‰ -x์”ฉ, ํ•ฉ์ณ -2x)

์„ธ ์นธ์˜ ํ•ฉ ๋ณ€ํ™”๋Š” 0, ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์€ํ–‰์˜ ํ•ฉ T๋Š” ์˜์›ํžˆ ๊ทธ๋Œ€๋กœ. ๋ฌธ์ œ ์กฐ๊ฑด์ƒ T > 0์ด ๋ณด์žฅ๋˜๋ฏ€๋กœ, ์ถฉ๋ถ„ํžˆ ๋งˆ๋ฒ•์„ ์“ฐ๋ฉด ๋ฐ˜๋“œ์‹œ ๋ชจ๋‘ 0 ์ด์ƒ์œผ๋กœ ์ˆ˜๋ ด ๊ฐ€๋Šฅ


2๋‹จ๊ณ„ โ€“ "์‹œ์ž‘์  โ†’ ๋ˆ„์ ํ•ฉ" ๋ชจ๋ธ

์›ํ˜• ์œ„ ์ž„์˜์˜ ์‹œ์ž‘์  i์—์„œ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋ถ€๋ถ„ํ•ฉ์„ ์Œ“์•„๊ฐˆ ๋•Œ, ๋ถ€๋ถ„ํ•ฉ์ด ์Œ์ˆ˜๋กœ ๋น ์ง€๋Š” ๊นŠ์ด๊ฐ€ ๊ณง ๊ทธ ๊ตฌ๊ฐ„์—์„œ ์ฑ„์›Œ์•ผ ํ•  ๋ถ€์กฑ๋ถ„. ํ•œ ๋ฐ”ํ€ด ํ•ฉ์ด T์ด๋ฏ€๋กœ ๊นŠ์ด |PS|๋ฅผ ๋ฉ”์šฐ๋ ค๋ฉด โŒˆ|PS| / TโŒ‰ ํšŒ์˜ ์ด์ฒด๊ฐ€ ์‹œ์ž‘์  i์— ์ฒญ๊ตฌ๋จ. ์ด ๊ฐ’์„ ๋ชจ๋“  ์‹œ์ž‘์  i, ๋ชจ๋“  j์— ๋Œ€ํ•ด ํ•ฉ์‚ฐํ•œ ๊ฒŒ ์ •๋‹ต

์˜ˆ์‹œ (N=4, A = [1, -2, -1, 3], T = 1)

2๋ฐฐ ๋ณต์ œ: [1, -2, -1, 3, 1, -2, -1, 3]
๋ˆ„์ ํ•ฉ dp[1..8]: [1, -1, -2, 1, 2, 0, -1, 2]

์‹œ์ž‘ i๋ถ€๋ถ„ํ•ฉ PS_j (j=i..i+N-1)์Œ์ˆ˜๋งŒ โŒˆ/TโŒ‰๊ธฐ์—ฌ
11, -1, -2, 11, 23
2-2, -3, 0, 12, 35
3-1, 2, 3, 111
43, 4, 2, 1(์—†์Œ)0

์ดํ•ฉ 9 โ†’ ์˜ˆ์ œ ์ •๋‹ต ์ผ์น˜


3๋‹จ๊ณ„ โ€“ ์›ํ˜• ์ฒ˜๋ฆฌ๋Š” ๋ฐฐ์—ด 2๋ฐฐ ๋ณต์ œ

๋งค ์‹œ์ž‘์ ๋งˆ๋‹ค ์ธ๋ฑ์Šค wrap-around๋ฅผ ๋”ฐ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง. ์ž…๋ ฅ์„ 2N ๊ธธ์ด๋กœ ๋ณต์ œํ•ด ๋ˆ„์ ํ•ฉ์„ ํ•œ ๋ฒˆ๋งŒ ๋งŒ๋“ค์–ด๋‘๋ฉด, ์‹œ์ž‘์  i์—์„œ j๊นŒ์ง€์˜ ๋ถ€๋ถ„ํ•ฉ์€ dp[j] - dp[i-1]๋กœ O(1)์— ์ถ”์ถœ ๊ฐ€๋Šฅ


4๋‹จ๊ณ„ โ€“ ์ž๋ฃŒํ˜•์€ long

N=9999, |ki|=32000 ๊ทผ๋ฐฉ์˜ ์ตœ์•… ์ž…๋ ฅ์—์„œ ๊ฒฐ๊ณผ๋Š” long ๋ฒ”์œ„๊นŒ์ง€ ๋„๋‹ฌ. int๋กœ ๋‘๋ฉด ์กฐ์šฉํžˆ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ


๐Ÿ’ป ํ•ต์‹ฌ ์ฝ”๋“œ

long[] dp = new long[2 * N + 1];
for (int i = 1; i <= N; i++) {
    int v = Integer.parseInt(st.nextToken());
    dp[i] = v;
    dp[i + N] = v;
}
for (int i = 1; i <= 2 * N; i++) {
    dp[i] += dp[i - 1];
}

long T = dp[N];
long ret = 0;
for (int i = 1; i <= N; i++) {
    long base = dp[i - 1];
    for (int j = i; j < N + i; j++) {
        long ps = dp[j] - base;
        if (ps >= 0) continue;
        long neg = -ps;
        ret += (neg + T - 1) / T;
    }
}
System.out.println(ret);

โณ ๋ณต์žก๋„ ๋ถ„์„

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(Nยฒ)
    • ์‹œ์ž‘์  N๊ฐœ ร— ๊ธธ์ด N ์œˆ๋„์šฐ, N=9999์—์„œ ์•ฝ 1์–ต ์—ฐ์‚ฐ์ด์ง€๋งŒ ๋‹จ์ˆœ ์‚ฐ์ˆ ์ด๋ผ 0.2์ดˆ๋Œ€ ํ†ต๊ณผ
  • ๊ณต๊ฐ„ ๋ณต์žก๋„: O(N)
    • 2N ๊ธธ์ด ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด ํ•œ ๊ฐœ

๐Ÿ“„ ์ „์ฒด ์ฝ”๋“œ

package rtaeho.week04.B10350;

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

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine().trim());
        StringTokenizer st = new StringTokenizer(br.readLine());

        long[] dp = new long[2 * N + 1];
        for (int i = 1; i <= N; i++) {
            int v = Integer.parseInt(st.nextToken());
            dp[i] = v;
            dp[i + N] = v;
        }
        for (int i = 1; i <= 2 * N; i++) {
            dp[i] += dp[i - 1];
        }

        long T = dp[N];

        long ret = 0;
        for (int i = 1; i <= N; i++) {
            long base = dp[i - 1];
            for (int j = i; j < N + i; j++) {
                long ps = dp[j] - base;
                if (ps >= 0) {
                    continue;
                }
                long neg = -ps;
                ret += (neg + T - 1) / T;
            }
        }

        System.out.println(ret);
    }
}

0๊ฐœ์˜ ๋Œ“๊ธ€