백준

백준 11660: 구간 합 구하기 5(java/python)

unhyepnhj 2024. 9. 26. 16:21

문제


풀이

이중 for문을 순회하며 (0, 0)부터 (i, j)인 지점까지의 합을 배열 arr에 저장하고, 이들을 적절히 가감하여 (x1, y1)부터 (x2, y2)인 지점까지의 누적 합을 계산한다.

 

전체 코드

 

1. java

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

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb=new StringBuilder();
		
		StringTokenizer st=new StringTokenizer(br.readLine());
		int N=Integer.parseInt(st.nextToken());
		int M=Integer.parseInt(st.nextToken());
		
		int[][] arr=new int[N+1][N+1];
		
		for(int i=1; i<N+1; i++) {
			st=new StringTokenizer(br.readLine());
			
			for(int j=1; j<N+1; j++) {
				int n=Integer.parseInt(st.nextToken());
				arr[i][j]=arr[i][j-1]+arr[i-1][j]-arr[i-1][j-1]+n;
			}
		}
		
		for(int i=0; i<M; i++) {
			st=new StringTokenizer(br.readLine());
			
			int x1=Integer.parseInt(st.nextToken());
			int y1=Integer.parseInt(st.nextToken());
			int x2=Integer.parseInt(st.nextToken());
			int y2=Integer.parseInt(st.nextToken());
			
			int res=arr[x2][y2]-arr[x1-1][y2]-arr[x2][y1-1]+arr[x1-1][y1-1];
			sb.append(res).append("\n");
		}
		
		System.out.println(sb);
	}
}

 

 

2. python

import sys
input = sys.stdin.readline

N, M = map(int, input().split())

table = [[0]*(N+1) for _ in range(N+1)]
rows = [0]*(N+1)

for i in range(1, N+1):
    rows = [0] + list(map(int, input().split()))

    for j in range(1, N+1):
        table[i][j] = table[i][j-1] + table[i-1][j] - table[i-1][j-1] + rows[j]

for i in range(M):
    x1, y1, x2, y2 = map(int, input().split())

    res = table[x2][y2] - table[x1 - 1][y2] - table[x2][y1 - 1] + table[x1 - 1][y1 - 1]

    print(res)