알고리즘 문제풀이

[코드업] 2차원 차이 배열 만들기 5-4 문제풀이(C++)

도리컴 2023. 2. 28. 23:06
반응형

greedy하게 해결하면 해결완료 / 누적합은 가로 따로, 세로 따로 구해주어야 함  + 세그멘테이션 오류 조심

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    #include<iostream>
    #include<vector>
    using namespace std;
 
    /*
    <문제>
    크기 n*m인 2차원배열 d[][]에서
    k개의 구간(x1, y1, x2, y2)와 u를 받아서
    d[x1][y1] += u
    d[x2+1][y2+1] += u
    d[x1][y2+1] -= u
    d[x2+1][y1] -= u
    수행 후, 누적합을 만들어서 출력
 
    <입력>
    n m k
    k개의 데이터 공백두고 출력(x1, y1, x2, y2, u)
    [입력값의 정의역]
    1 <= n, m <=1000
    1 <= k <= 700
    1 <= x1 <= x2 <= n
    1 <= y1 <= y2 <= m
    -1000 <= u <= 1000
 
    <출력>
    n*m배열 상태를 출력 후,
    줄 바꿔서 2차원 누적합 계산해서 출력
    */
    int main() {
        int n, m, k; cin >> n >> m >> k;
        int d[1001][1001];    //n*m 배열 생성
 
        for (int i = 0; i < k; i++) {    //k번 반복
            int x1, y1, x2, y2, u; cin >> x1 >> y1 >> x2 >> y2 >> u;
            d[x1][y1] += u;
            d[x2 + 1][y2 + 1+= u;
            d[x1][y2 + 1-= u;
            d[x2 + 1][y1] -= u;
        }
 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cout << d[i][j] << " ";
            }
            cout << endl;
        }
        cout << endl;
        for (int j = 0; j < m; j++)
            for (int i = 0; i < n; i++)
                if (i + 1 < n) d[i + 1][j] += d[i][j];
 
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (j + 1 < m) d[i][j + 1+= d[i][j];
 
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cout << d[i][j] << " ";
            }
            cout << endl;
        }
        return 0;
    }
cs

반응형