
BOJ 1009 분산처리
2023-05-25
1 min
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).
해당 문제는 2차원 배열에서 주어진 부분 배열의 합을 구하는 문제이다.
하지만 주의해야 할 부분이 있다.
일반적으로 배열의 부분 합을 구할 때에는 아래 그림과 같은 영역의 합을 구할 것이다.
하지만 해당 문제에서 계산해야 할 영역은 아래의 그림과 같은 영역이다.
위의 사실만 주의하며 구현하면 문제를 쉽게 해결할 수 있다.
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 배열의 크기 입력
String[] s = br.readLine().split(" ");
int M = Integer.parseInt(s[0]);
int N = Integer.parseInt(s[1]);
// 배열 생성 및 입력
int[][] arr = new int[M][N];
for (int i = 0; i < M; i++) {
s = br.readLine().split(" ");
for (int j = 0; j < N; j++) arr[i][j] = Integer.parseInt(s[j]);
}
// 배열의 합 계산
int cnt = Integer.parseInt(br.readLine());
for (int i = 0; i < cnt; i++) {
s = br.readLine().split(" ");
int sx = Integer.parseInt(s[0]) - 1, sy = Integer.parseInt(s[1]) - 1;
int ex = Integer.parseInt(s[2]) - 1, ey = Integer.parseInt(s[3]) - 1;
int sum = 0;
for (int j = sx; j <= ex; j++) {
for (int k = sy; k <= ey; k++) {
sum += arr[j][k];
}
}
sb.append(sum + "\n");
}
System.out.println(sb);
}
}
#include <iostream>
#define fastio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)
#define endl '\n'
using namespace std;
int main() {
fastio;
// 배열의 크기 입력
int M, N;
cin >> M >> N;
// 배열 생성 및 입력
int arr[M][N];
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cin >> arr[i][j];
}
}
// 배열의 합 계산
int cnt;
cin >> cnt;
for (int i = 0; i < cnt; i++) {
int sx, sy, ex, ey;
cin >> sx >> sy >> ex >> ey;
sx--; sy--; ex--; ey--;
int sum = 0;
for (int j = sx; j <= ex; j++) {
for (int k = sy; k <= ey; k++) {
sum += arr[j][k];
}
}
cout << sum << endl;
}
return 0;
}
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
// 배열의 크기 입력
var s = readLine().split(" ")
var M = s[0].toInt()
var N = s[1].toInt()
// 배열 생성 및 입력
var arr = Array(M, {IntArray(N, {0})})
for(i in 0 until M) {
s = readLine().split(" ")
for(j in 0 until N) {
arr[i][j] = s[j].toInt()
}
}
// 배열의 합 계산
var cnt = readLine().toInt()
for(i in 0 until cnt) {
s = readLine().split(" ")
var sx = s[0].toInt() - 1
var sy = s[1].toInt() - 1
var ex = s[2].toInt() - 1
var ey = s[3].toInt() - 1
var sum = 0
for(j in sx..ex) {
for(k in sy..ey) {
sum = sum + arr[j][k]
}
}
println(sum)
}
}
from sys import stdin
def main():
# 배열의 크기 입력
s = stdin.readline().split(" ")
M = int(s[0])
N = int(s[1])
# 배열 생성 및 입력
arr = [[0 for j in range(N)] for i in range(M)]
for i in range(0, M):
s = stdin.readline().split(" ")
for j in range(0, N):
arr[i][j] = int(s[j])
# 배열의 합 계산
cnt = int(stdin.readline())
for i in range(0, cnt):
s = stdin.readline().split(" ")
sx = int(s[0]) - 1
sy = int(s[1]) - 1
ex = int(s[2]) - 1
ey = int(s[3]) - 1
sum = 0
for j in range(sx, ex + 1):
for k in range(sy, ey + 1):
sum = sum + arr[j][k]
print(sum)
if __name__ == "__main__":
main()
import Foundation
func main() {
// 배열의 크기 입력
var s = readLine()!.split(separator: " ")
var M = Int(s[0])!
var N = Int(s[1])!
// 배열 생성 및 입력
var arr = Array(repeating: Array(repeating: 0, count: N), count: M)
for i in 0..<M {
s = readLine()!.split(separator: " ")
for j in 0..<N {
arr[i][j] = Int(s[j])!
}
}
// 배열의 합 계산
var cnt = Int(readLine()!)!
for i in 0..<cnt {
s = readLine()!.split(separator: " ")
var sx = Int(s[0])! - 1
var sy = Int(s[1])! - 1
var ex = Int(s[2])! - 1
var ey = Int(s[3])! - 1
var sum = 0
for j in sx...ex {
for k in sy...ey {
sum = sum + arr[j][k]
}
}
print(sum)
}
}
main()
