코딩테스트/BOJ

[BOJ] 2167 2차원 배열의 합 - JAVA

5월._. 2023. 4. 2.
728x90

1. 문제

 

2167번: 2차원 배열의 합

첫째 줄에 배열의 크기 N, M(1 ≤ N, M ≤ 300)이 주어진다. 다음 N개의 줄에는 M개의 정수로 배열이 주어진다. 배열에 포함되어 있는 수는 절댓값이 10,000보다 작거나 같은 정수이다. 그 다음 줄에는

www.acmicpc.net

2차원 배열이 주어졌을 때 (i, j) 위치부터 (x, y) 위치까지에 저장되어 있는 수들의 합을 구하는 프로그램을 작성하시오. 배열의 (i, j) 위치는 i행 j열을 나타낸다.


2. 풀이

[이 문제]와 동일한 방식으로 풀었다. 그림도 이전 글에서 가져왔다. (i,j)까지의 합은 (i-1,j)와 (i,j-1)을 합친 값에서 (i-1,j-1)을 뺀 것과 같다. 

따라서 (i,j)부터 (x,y)까지 합을 구하려면 단순히 (x,y)-(i-1,j-1)을 하면 되는 게 아니라 (x,y)-(x,j-1)-(i-1,y)+(i-1,j-1)을 해야 한다. 

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

public class BOJ_2167_2차원배열의합 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(in.readLine());
      int N = Integer.parseInt(st.nextToken());
      int M = Integer.parseInt(st.nextToken());
      int[][] sum = new int[N+1][M+1];

      //입력 및 합 구하기
      for(int i=1;i<=N;i++){
         st = new StringTokenizer(in.readLine());
         for(int j=1;j<=M;j++){
            sum[i][j] = Integer.parseInt(st.nextToken()) + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
         }
      }

      //계산
      int K = Integer.parseInt(in.readLine());
      StringBuilder sb = new StringBuilder();
      int i,j,x,y;
      for(int k=0;k<K;k++){
         st = new StringTokenizer(in.readLine());
         i = Integer.parseInt(st.nextToken());
         j = Integer.parseInt(st.nextToken());
         x = Integer.parseInt(st.nextToken());
         y = Integer.parseInt(st.nextToken());
         sb.append(sum[x][y]-sum[x][j-1]-sum[i-1][y]+sum[i-1][j-1]).append('\n');
      }

      System.out.print(sb);
   }
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 2143 두 배열의 합 - JAVA  (0) 2023.04.04
[BOJ] 10986 나머지 합 - JAVA  (0) 2023.04.03
[BOJ] 15565 귀여운 라이언 - JAVA  (0) 2023.04.01
[BOJ] 1484 다이어트 - JAVA  (0) 2023.03.31
[BOJ] 15961 회전초밥 - JAVA  (0) 2023.03.30

댓글