πŸ•οΈ PS (BOJ)/Prefix Sum

[C++][BOJ] λ°±μ€€ 2167번: 2차원 λ°°μ—΄μ˜ ν•©

선달 2024. 8. 8. 17:50
λ°˜μ‘ν˜•

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

 

문제

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보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

 

풀이

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> input(n+1, vector<int>(m+1));
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            cin >> input[i][j];
        }
    }
    
    // λˆ„μ ν•© κ΅¬ν•˜κΈ°
    vector<vector<int>> sum(n+1, vector<int>(m+1));
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + input[i][j];
        }
    }

    int k, i,j,x,y;
    cin >> k;
    while(k--) {
        cin >> i >> j >> x >> y;
        cout << sum[x][y] - sum[i-1][y] - sum[x][j-1] + sum[i-1][j-1] << "\n";
    }
    
    return 0;
}

 

 

2025.04.21 풀이 μΆ”κ°€

// 풀이 : https://whkakrkr.tistory.com

#include <bits/stdc++.h>

using namespace std;

typedef tuple<int, int, int, int> ci;

void solution(int n, int m, vector<vector<int>>&v, int k, vector<ci>t) {
    // λˆ„μ ν•© κ΅¬ν•˜κΈ°
    vector<vector<int>> prefix(n+1, vector<int>(m+1, 0));
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            prefix[i][j] = prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1] + v[i-1][j-1];
        }
    }
    
    // λˆ„μ ν•© κ³„μ‚°ν•˜κΈ°
    for(auto cur : t) {
        int i = get<0>(cur);
        int j = get<1>(cur);
        int x = get<2>(cur);
        int y = get<3>(cur);
        
        int ans = prefix[x][y] - prefix[i-1][y] - prefix[x][j-1] + prefix[i-1][j-1];
        cout << ans << "\n";
    }

}

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	int n,m;
	cin >> n >> m;
	vector<vector<int>>v(n, vector<int>(m));
	for(int i=0; i<n; i++) {
	    for(int j=0; j<m; j++) {
	        cin >> v[i][j];
	    }
	}
	
	int k, i,j,x,y;
	cin >> k;
	vector<ci>t(k);
	for(int idx=0; idx<k; idx++) {
	    cin >> i >> j >> x >> y;
	    t[idx] = make_tuple(i,j,x,y);
	}
	
	solution(n,m,v,k,t);

    return 0;
}
λ°˜μ‘ν˜•