끄적끄적 코딩
article thumbnail

누적합 문제입니다.

직사각형안의 값들의 평균을 구하는 문제입니다.
(R * C) * Q =  (1000 * 1000) * 10000
=> 10_000_000_000이 나오므로 매번 모든 값들을 더하면 시간초과가 발생합니다.
 
2차원 배열의 누적합을 구해줍니다.
직사각형이 주어지면 해당 위치의 값을 누적합을 통해서 구하고 안의 개수만큼 나누어서 평균을 출력해줍니다.

import java.util.*;
import java.io.*;

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

    int r = Integer.parseInt(st.nextToken());
    int c = Integer.parseInt(st.nextToken());
    int q = Integer.parseInt(st.nextToken());
    int[][] map = new int[r + 1][c + 1];
    int result = 0;

    for (int i = 1; i <= r; ++i) {
      st = new StringTokenizer(br.readLine());
      for (int j = 1; j <= c; ++j) {
        int num = Integer.parseInt(st.nextToken());
        map[i][j] = map[i - 1][j] + map[i][j - 1] - map[i - 1][j - 1] + num;
      }
    }

    for (int i = 0; i < q; ++i) {
      st = new StringTokenizer(br.readLine());
      int y1 = Integer.parseInt(st.nextToken());
      int x1 = Integer.parseInt(st.nextToken());
      int y2 = Integer.parseInt(st.nextToken());
      int x2 = Integer.parseInt(st.nextToken());
      int div = (y2 - y1 + 1) * (x2 - x1 + 1);

      result = (map[y2][x2] - map[y1 - 1][x2] - map[y2][x1 - 1] + map[y1 - 1][x1 - 1]) / div;
      bw.write(result + "\n");
    }

    bw.close();
  }
}



'알고리즘' 카테고리의 다른 글

[Java] 백준 1549번 K  (0) 2023.08.09
[Java] 백준 1394번 암호  (0) 2023.08.09
[Java] 백준 2230번 수 고르기  (0) 2023.08.09
[Java] 백준 11509번 풍선 맞추기  (0) 2023.08.09
[Java] 백준 1092번 배  (0) 2023.08.08

검색 태그