17123번 : 배열 놀이
문제)
N개의 행과 N개의 열로 구성된 2차원 정수 배열 A가 있다. A[r, c]는 r번째 행 c번째 열에 위치한 원소의 값을 나타낸다.
이 배열에 총 M번의 연산을 적용하는 배열 놀이를 생각해보자.
각 연산에 대해 1 <= r1 <= r2 <= N, 1 <= c1 <= c2 <= N, -1,000 <= v <= 1,000을 만족하는 다섯 개의 정수 파라미터 (r1, c1, r2, c2, v)가 주어지는데, 이 연산은 (r1, c1)부터 (r2, c2)까지 사각형 영역에 속한 A[r, c]의 값을 v만큼 더하는 것이다.
예를 들어 N = 3 그리고 A = [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ] 인 2차원 배열을 생각해보자. 아래와 같은 3개의 연산을 순서대로 적용한다고 하자.
- 연산 1: (r1 = 1, c1 = 1, r2 = 2, c2 = 3, v = 3)
- 연산 2: (r1 = 2, c1 = 2, r2 = 3, c2 = 2, v = -5)
- 연산 3: (r1 = 1, c1 = 1, r2 = 3, c2 = 2, v = 1)
연산을 적용하기 전 A는 아래와 같다.
A = [ [ 1 2 3 ]
[ 4 5 6 ]
[ 7 8 9 ] ].
연산 1을 적용하면 첫 두 행에 포함된 여섯 개의 원소 값이 바뀌게 되어 아래와 같아진다 (굵게 표시된 수들의 값이 바뀌었다):
A = [ [ 4 5 6 ]
[ 7 8 9 ]
[ 7 8 9 ] ].
연산 2를 적용한 후:
A = [ [ 4 5 6 ]
[ 7 3 9 ]
[ 7 3 9 ] ].
연산 3을 적용한 후:
A = [ [ 5 6 6 ]
[ 8 4 9 ]
[ 8 4 9 ] ].
이렇게 총 3개의 연산을 모두 적용하고 난 후, 당신은 마지막에 얻은 배열의 각 행의 원소들의 합과 각 열의 원소들의 합을 구하고 싶다. 위의 예제의 경우, 행의 원소들의 합은 [17, 21, 21] 이며 (1번 행 부터 3번 행까지) 열의 원소들의 합은 [21, 14, 24] 이다 (1번 열 부터 3번 열 까지).
입력으로 N, M, 2차원 배열 A, 그리고 M개의 연산이 주어졌을 때, 배열에 연산을 모두 적용한 후 해당 배열의 행의 원소들의 합과 열의 원소들의 합을 구하는 프로그램을 작성하시오.
입력 :
첫 줄에 테스트 케이스의 수 T가 주어진다 (1 <= T <= 10).
각 테스트 케이스에 대하여: 첫 줄에 두 개의 정수 N과 M이 공백으로 구분되어 주어진다 (1 <= N <= 1,000 과 1 <= M <= 1,000 을 만족한다).
다음 N줄에 걸쳐서 2차원 배열 A가 주어지는데, i-번째 줄이 i-번째 행을 나타낸다. 각 줄의 j번째 정수는 j-번째 열의 원소 값을 나타낸다. 배열 A의 각 원소의 값은 1이상 1,000 이하의 정수이다.
다음 M줄에 걸쳐서 각 줄에 다섯 개의 정수 r1, c1, r2, c2, v가 공백으로 구분되어 주어진다. 항상 1 <= r1 <= r2 <= N 그리고 1 <= c1 <= c2 <= N 그리고 -1,000 <= v <= 1,000 을 만족한다.
출력 :
각 테스트 케이스에 대해 두 줄에 걸쳐서 정답을 출력해야 한다.
두 줄 중 첫 줄에는 N개의 정수로 표현된 각 행의 합을 공백으로 구분하여 출력하고 (1번 행 부터 N번 행 까지)
둘째 줄에는 N개의 정수로 표현된 각 열의 합을 공백으로 구분하여 출력한다 (1번 열 부터 N번 열 까지).
풀이)
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
|
#include <iostream>
#include <vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
int a, b;
while (t--)
{
cin >> a >> b;
vector<vector<int>> vec;
vec.resize(a, vector<int>());
vector<int> r(a, 0);
vector<int> c(a, 0);
int temp;
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
cin >> temp;
r[i] += temp;
c[j] += temp;
}
}
for (int _ = 0; _ < b; _++)
{
int r1, c1, r2, c2, v;
cin >> r1 >> c1 >> r2 >> c2 >> v;
for (int i = r1 - 1; i < r2; i++)
{
r[i] += (c2 -c1 + 1) * v;
}
for (int j = c1 - 1; j < c2; j++)
{
c[j] += (r2 - r1 + 1) * v;
}
}
for (auto ele : r) cout << ele << " ";
cout << '\n';
for (auto ele : c) cout << ele << " ";
cout << '\n';
}
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/17123
17123번: 배열 놀이
N개의 행과 N개의 열로 구성된 2차원 정수 배열 A가 있다. A[r, c]는 r번째 행 c번째 열에 위치한 원소의 값을 나타낸다. 이 배열에 총 M번의 연산을 적용하는 배열 놀이를 생각해보자. 각 연산에 대
www.acmicpc.net
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 18258번 : 큐 2 (C++) (0) | 2023.09.02 |
---|---|
[백준] 14888번 : 연산자 끼워넣기 (C++) (0) | 2023.09.02 |
[백준] 1916번 : 최소비용 구하기 (C++) (0) | 2023.08.31 |
[백준] 17836번 : 공주님을 구해라! (C++) (0) | 2023.08.31 |
[백준] 18222번 : 투에-모스 문자열 (C++) (0) | 2023.08.31 |