Algorithm/BOJ

[Boj_2167] 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ•ฉ

jeong_ii 2023. 11. 4. 01:59

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

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

 

2167๋ฒˆ: 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ•ฉ

์ฒซ์งธ ์ค„์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ N, M(1 ≤ N, M ≤ 300)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์—๋Š”

www.acmicpc.net

 

โ–ธ ๋ฌธ์ œ

2์ฐจ์› ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ (i, j) ์œ„์น˜๋ถ€ํ„ฐ (x, y) ์œ„์น˜๊นŒ์ง€์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ˆ˜๋“ค์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ฐฐ์—ด์˜ (i, j) ์œ„์น˜๋Š” iํ–‰ j์—ด์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ N, M(1 ≤ N, M ≤ 300)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ •์ˆ˜๋กœ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ํ•ฉ์„ ๊ตฌํ•  ๋ถ€๋ถ„์˜ ๊ฐœ์ˆ˜ K(1 ≤ K ≤ 10,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ K๊ฐœ์˜ ์ค„์—๋Š” ๋„ค ๊ฐœ์˜ ์ •์ˆ˜๋กœ i, j, x, y๊ฐ€ ์ฃผ์–ด์ง„๋‹ค(1 ≤ i ≤ x ≤ N, 1 ≤ j ≤ y ≤ M).

 

โ–ธ ์ถœ๋ ฅ

K๊ฐœ์˜ ์ค„์— ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ํ•ฉ์€ 231-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

 

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

  • ๐Ÿฅˆ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ์‹ค๋ฒ„ 5
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ตฌํ˜„, ๋ˆ„์  ํ•ฉ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

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

  • ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ 2์ฐจ์› ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•  ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ ๋’ค, ๋ฐฐ์—ด์— ๋ˆ„์ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ €์žฅํ–ˆ๋‹ค.
    • prefix[i][j] = map[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];
  • (i, j) ์œ„์น˜๋ถ€ํ„ฐ (x, y) ์œ„์น˜๊นŒ์ง€์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ ํ™”์‹์„ ์ฐพ์•„ ํ•ด๊ฒฐํ–ˆ๋‹ค.
    • ์ ํ™”์‹ : prefix[x][y] - prefix[i-1][y] - prefix[x][j-1] + prefix[i-1][j-1];
    • ํ•ฉ์ง‘ํ•ฉ = ์ „์ฒด ๋ˆ„์ ํ•ฉ - ์™ผ์ชฝ ๋ˆ„์ ํ•ฉ - ์œ„์ชฝ ๋ˆ„์ ํ•ฉ + ๊ต์ง‘ํ•ฉ ๋ˆ„์ ํ•ฉ

 

๐Ÿ” ๋ˆ„์ ํ•ฉ์ด๋ž€ ?

  • ๋ฐฐ์—ด์˜ ์ผ๋ถ€ ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ํ•ฉ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ฐฐ์—ด์˜ ๊ฐ’๋“ค์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ˆ„์ ๋œ ํ•ฉ ๋˜ํ•œ ๋ณ€๋™์ด ์—†๋‹ค๋Š” ์ ์„ ์ ์šฉํ•œ๋‹ค.
  • ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋‘” ๋ˆ„์ ํ•ฉ์„ ํ†ตํ•ด ๋ฐฐ์—ด ์ค‘ ํŠน์ • ๊ตฌ๊ฐ„์˜ ๋ถ€๋ถ„ํ•ฉ์„ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋‘๋Š” ์ ์ด DP์™€ ์œ ์‚ฌํ•˜๋‹ค.

 

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

๋ฉ”๋ชจ๋ฆฌ : 26240 KB 
์‹œ๊ฐ„ : 276 ms
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 m = Integer.parseInt(st.nextToken());
        int[][] map = new int[n+1][m+1];
        int[][] prefix = new int[n+1][m+1]; // ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•  ๋ฐฐ์—ด
        for (int i = 1; i <= n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= m; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
                // ๋ฐฐ์—ด์— ๋ˆ„์ ํ•ฉ ์ €์žฅํ•˜๊ธฐ
                prefix[i][j] = map[i][j] + prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1];
            }
        }
        
        int k = Integer.parseInt(br.readLine()); // ํ•ฉ์„ ๊ตฌํ•  ๋ถ€๋ถ„์˜ ๊ฐœ์ˆ˜
        while (k --> 0) {
            st = new StringTokenizer(br.readLine());
            // (i, j) ์œ„์น˜๋ถ€ํ„ฐ (x, y) ์œ„์น˜
            int i = Integer.parseInt(st.nextToken());
            int j = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            // ans : (i, j) ์œ„์น˜๋ถ€ํ„ฐ (x, y) ์œ„์น˜๊นŒ์ง€์˜ ํ•ฉ
            // ์ ํ™”์‹ : ์ „์ฒด ๋ˆ„์ ํ•ฉ - ์™ผ์ชฝ ๋ˆ„์ ํ•ฉ - ์œ„์ชฝ ๋ˆ„์ ํ•ฉ + ๊ต์ง‘ํ•ฉ ๋ˆ„์ ํ•ฉ
            int ans = prefix[x][y] - prefix[i-1][y] - prefix[x][j-1] + prefix[i-1][j-1];
            bw.append(ans + "\n");
        }
        bw.flush();
        bw.close();
        br.close();
    }
}


 

 

๐Ÿ“ ํ•จ๊ป˜ ํ’€์–ด๋ณด๋ฉด ์ข‹์€ ๋ฐฑ์ค€ ๋ฌธ์ œ