๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

2632 - ํ”ผ์žํŒ๋งค

๋ฌธ์ œ: boj.kr/2632
๋‚ ์งœ: 08/25 (์ผ)
์„ฑ๊ณต์—ฌ๋ถ€: X

 

์ด ๋ฌธ์ œ ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค.

 

์ฒ˜์Œ์œผ๋กœ ์ƒ๊ฐํ•ด๋‚ธ ๋กœ์ง์€ ๊ทธ๋ƒฅ ๋ฌด์‹ํ•˜๊ฒŒ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•ด์„œ ์›ํ•˜๋Š” ๊ฐ’ ๋˜๋Š” ๊ฑฐ ์ฐพ์œผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? ํ•˜๊ณ  ๋ฌธ์ œ ๋ฒ”์œ„๋ฅผ ๋ดค๋Š”๋ฐ, 3 <= m, n <= 1000์ด๋‹ค. 1000C1, 1000C2, 1000C3 .... ์ด๊ฑธ A, B ๋‘ ๋ฒˆ ๊ตฌํ•ด์„œ A, B์— ๋Œ€ํ•ด ๋‹ค for๋ฌธ ๋Œ๋ฆฐ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋‚  ๊ฒƒ์ด ๋ป”ํ–ˆ์Œ..

 

๊ทผ๋ฐ ์ด๊ฑฐ ์•„๋‹ˆ๋ฉด ์•„๋ฌด ๋กœ์ง๋„ ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•„์„œ ํ•ด์„ค ๋ดค๋‹ค. ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

  1. ์›ํ˜•์„ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค๊ธฐ
  2. ๋‚˜์˜ค๋Š” ๊ฐ’์— ๋Œ€ํ•ด์„œ A, B ๊ฐ๊ฐ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ
  3. ๊ตฌํ•œ ๊ฐœ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ret ๊ฐ’ ๋งŒ๋“ค๊ธฐ

 

 

1. ์›ํ˜•์„ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค๊ธฐ

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํ”ผ์ž๋ฅผ ์—ฐ์†ํ•ด์„œ ํŒ”๊ธฐ ๋•Œ๋ฌธ์— ํ”ผ์ž๊ฐ€ ์›ํ˜•์ด๋ผ ํ•œ๋ฐ”ํ€ด ๋Œ์•„์„œ ํ”ผ์ž๋ฅผ ์„ ํƒํ•ด ํŒ๋งค๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, 7 2 2 2 1๊ณผ ๊ฐ™์€ ํ”ผ์ž๊ฐ€ ์žˆ์„ ๋•Œ ๊ฐ’ 1 7 2 ์ฒ˜๋Ÿผ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด๋ฅผ ์›ํ˜• ๊ทธ๋Œ€๋กœ ํ•˜๋Š”๊ฑด ์–ด๋ ต๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐฐ์—ด์„ ๋์— ํ•˜๋‚˜ ๋” ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค. ํ”ผ์ž๋ฅผ ํŒ๋งคํ•  ๋•Œ ํ”ผ์ž์˜ ์กฐ๊ฐ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ํŒ” ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ๋’ค์— ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋” ๋ถ™์ด๊ธฐ๋งŒ ํ•˜๋ฉด ์›ํ˜•์ฒ˜๋Ÿผ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

1๊ฐœ
7 2 2 2 1 7 2 2 2 1
-
  -
    -
      -
        -

2๊ฐœ
7 2 2 2 1 7 2 2 2 1
- -
  - -
    - -
      - -
        - - ์ด ๋‹ค์Œ๋ถ€ํ„ด ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜

3๊ฐœ
7 2 2 2 1 7 2 2 2 1
- - -
  - - -
    - - -
      - - -
        - - - ์ด ๋‹ค์Œ๋ถ€ํ„ด ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜

4๊ฐœ
7 2 2 2 1 7 2 2 2 1
- - - -
  - - - -
    - - - -
      - - - -
        - - - - ์ด ๋‹ค์Œ๋ถ€ํ„ด ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜

5๊ฐœ
7 2 2 2 1 7 2 2 2 1
- - - - -

 

์ด๋ ‡๊ฒŒ ์„ ํ˜•์ ์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์ด ์ธ๋ฑ์Šค๊ฐ€ 0๋ถ€ํ„ฐ๊ฐ€ ์•„๋‹Œ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, 1๊ฐœ์ผ๋• idx 5๊นŒ์ง€์ด๊ณ  2๊ฐœ ์ผ๋• idx 6๊นŒ์ง€, 3์ผ๋•Œ๋Š” idx 7, 4์ผ๋•Œ๋Š” idx 8๊นŒ์ง€์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑธ ์ข€ ์ผ๋ฐ˜ํ™”ํ•˜๋ฉด ์ „์ฒด ํฌ๊ธฐ n์— ๋Œ€ํ•ด n + ๋ฝ‘๋Š” ๊ฐœ์ˆ˜ r - 1์ด ๋œ๋‹ค.

 

์ฆ‰, ๊ฒฝ์šฐ์˜ ์ˆ˜๋งˆ๋‹ค ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ์œ„ํ•ด์„œ n + r - 1 (n: ์กฐ๊ฐ ๊ฐœ์ˆ˜, r: ๋ฝ‘๋Š” ๊ฐœ์ˆ˜)๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์•ผํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

 

2. ๋‚˜์˜ค๋Š” ๊ฐ’์— ๋Œ€ํ•ด์„œ A, B ๊ฐ๊ฐ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ

์—ฌ๊ธฐ์„œ๋Š” ๋ˆ„์ ํ•ฉ ๋กœ์ง์ด ์“ฐ์ธ๋‹ค.

 

์œ„์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•  ๋•Œ ์‚ฌ์‹ค ํ•˜๋‚˜์”ฉ ๋ฝ‘์•„์„œ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฌ๋ฉด 3์ค‘ for๋ฌธ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๋ฝ‘๋Š” ๊ฐฏ์ˆ˜(1->5)
	๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ณ„ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค (๋ฝ‘๋Š” ๊ฐœ์ˆ˜ -> n + ๋ฝ‘๋Š” ๊ฐœ์ˆ˜ - 1)
		์‹ค์ œ๋กœ ๋ฝ‘๊ธฐ (๋ฝ‘๋Š” ๊ฐœ์ˆ˜ -> 0)

 

๊ทธ๋Ÿผ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ฝ‘๋Š” ๊ฐœ์ˆ˜๊ฐ€ 1000, ์ธ๋ฑ์Šค๋Š” 1000 * 2(์ด ๋ถ€๋ถ„์€ ๋ถ€์ •ํ™•ํ•˜๋‚˜ 1000์ธ ๊ฒƒ์€ ํ™•์‹ค), ์‹ค์ œ๋กœ ๋ฝ‘๋Š” ๊ฒƒ๋„ 1000

= 2000000000 ์•ฝ 20์–ต์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋ฝ‘๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ˆ„์ ํ•ฉ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด 1000 * 1000 * 2

= 2000000 ์•ฝ 200๋งŒ์œผ๋กœ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

๋ˆ„์ ํ•ฉ์„ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ฐฐ์—ด์„ ๋์— ๋ถ™์—ฌ๋†“๊ณ , ๊ทธ๋Œ€๋กœ 1 ~ n*2๊นŒ์ง€ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•ด๋†“์œผ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿผ ์›ํ˜•์ด๋ผ๋„ ๋ฌธ์ œ์—†์ด ๋ˆ„์ ํ•ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด..

 

3๊ฐœ
7 9 11 13 14 21 23 25 27 28
- - -
= 11 (7 2 2)

7 9 11 13 14 21 23 25 27 28 ์œ„์˜ ๋ˆ„์ ํ•ฉ์—์„œ ์•„๋ž˜ ๋ˆ„์ ํ•ฉ์„ ๋บ€๋‹ค.
- - -  -
-
= 6 (2 2 2)

7 9 11 13 14 21 23 25 27 28
- - -  -  -
- -
= 5 (2 2 1)

7 9 11 13 14 21 23 25 27 28
- - -  -  -  -
- - -
= 10 (2 1 7)

7 9 11 13 14 21 23 25 27 28
- - -  -  -  -  -
- - -  -
= 10 (1 7 2) ์ด ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋ฏ€๋กœ stop

 

์ด๋ ‡๊ฒŒ ์ž˜ ์ ์šฉ๋˜๋Š” ๋ชจ์Šต์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. index๋ฅผ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ด์œ ๋Š” ๋ˆ„์ ํ•ฉ์ด๋‹ค๋ณด๋‹ˆ A[i] += A[i - 1]; ๊ณผ ๊ฐ™์€ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด 0์„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋‹ˆ๊นŒ ์ฐจ๋ผ๋ฆฌ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€ ์›ํ˜•์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์„ ํ˜•์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ๊ณ  ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ–ˆ๋‹ค. ์ด์ œ ํ•ด๋‹น ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋А๋ƒ ์ธ๋ฐ ์ด๊ฑด Map์œผ๋กœ ์ €์žฅํ•˜์˜€๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ค ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ”๋กœ๋ฐ”๋กœ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ํŽธ๋ฆฌํ•˜๋‹ค.

 

 

 

3. ๊ตฌํ•œ ๊ฐœ์ˆ˜๋ฅผ ์ด์šฉํ•ด ret ๊ฐ’ ๋งŒ๋“ค๊ธฐ

์ด์ œ ๊ตฌํ•œ ๊ฐœ์ˆ˜๋ฅผ ์ด์šฉํ•ด ret ๊ฐ’์„ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

 

์†๋‹˜์ด ์‚ฌ๋ ค๊ณ  ํ•˜๋Š” ํ”ผ์ž์˜ ์กฐ๊ฐ ํ•ฉ์ด 7์ด๋ผ๋ฉด 0 ~ 7๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ mapA.get(i) * mapB.get(7 - i)๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ret ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ, i = 3์ด๋ฉด A ํ”ผ์ž์—์„œ 3์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ฐœ์ˆ˜์™€ B ํ”ผ์ž์—์„œ 4๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ฐœ์ˆ˜๋ฅผ ๊ณฑํ•˜๋ฉด A, B ํ”ผ์ž๋ฅผ ์ด์šฉํ•ด์„œ ์ดํ•ฉ 7์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์•ฝ B ํ”ผ์ž์—์„œ 4๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฉด ์• ์ดˆ์— ์ด ๊ฒฝ์šฐ ํ”ผ์ž๋ฅผ 7๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ ํ•œ ํ”ผ์ž์—์„œ ๋ฐ”๋กœ 7์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์ธ๋ฐ ์ด๋Ÿฌ๋ฉด ์ € ๋กœ์ง ์ƒ mapA.get(7) * mapB.get(0)์ด ๋˜์–ด๋ฒ„๋ฆฌ๋‹ˆ๊นŒ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฐ’์ด ๋‚˜์˜จ๋‹ค. ๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰ ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋”ฐ๋กœ ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

 

์ฝ”๋“œ

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {

    static int ret = 0;
    static int[] A;
    static int[] B;
    static int m, n;
    static int pizza;
    static Map<Integer, Integer> mpa = new HashMap<>();
    static Map<Integer, Integer> mpb = new HashMap<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        pizza = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());

        A = new int[m * 2 + 1];
        B = new int[n * 2 + 1];

        for (int i = 1; i <= m; i++) A[i] = A[i+m] = Integer.parseInt(br.readLine());
        for (int i = 1; i <= n; i++) B[i] = B[i+n] = Integer.parseInt(br.readLine());

        for (int i = 1; i <= m * 2; i++) A[i] += A[i - 1];
        for (int i = 1; i <= n * 2; i++) B[i] += B[i - 1];

        int sum;

        for (int interval = 1; interval <= m; interval++) {
            for (int start = interval; start <= m + interval - 1; start++) {
                sum = A[start] - A[start - interval];
                if (!mpa.containsKey(sum)) mpa.put(sum, 1);
                else mpa.put(sum, mpa.get(sum) + 1);
                if (interval == m) break;
            }
        }

        for (int interval = 1; interval <= n; interval++) {
            for (int start = interval; start <= n + interval - 1; start++) {
                sum = B[start] - B[start - interval];
                if (!mpb.containsKey(sum)) mpb.put(sum, 1);
                else mpb.put(sum, mpb.get(sum) + 1);
                if (interval == n) break;
            }
        }

        if (mpa.containsKey(pizza))
            ret = mpa.get(pizza);
        if (mpb.containsKey(pizza))
            ret += mpb.get(pizza);
        for (int i = 1; i < pizza; i++)
            if (mpa.containsKey(i) && mpb.containsKey(pizza - i))
                ret += (mpa.get(i) * mpb.get(pizza - i));

        System.out.println(ret);
    }
}