백준/실버
[백준 16967번] 배열 복원하기 (C++)
게임개발기원
2023. 9. 30. 15:06
문제링크 : https://www.acmicpc.net/problem/16967
16967번: 배열 복원하기
크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int H, W, X, Y;
int arr[601][601];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> H >> W >> X >> Y;
for(int i=0; i<H+X; i++) //변화한 배열 입력
{
for(int j=0; j<W+Y; j++)
{
cin >> arr[i][j];
}
}
for(int i=X; i<H; i++) //복원
{
for(int j=Y; j<W; j++)
{
arr[i][j] -= arr[i-X][j-Y];
}
}
for(int i=0; i<H; i++) //복원 배열 출력
{
for(int j=0; j<W; j++)
{
cout << arr[i][j] << " ";
}
cout <<"\n";
}
return 0;
}
단순 구현 문제이다.
기존 배열을 주어진 조건에 따라 이동하여 만들어진 배열에 대해 중복하여 더해진 것 만큼 빼주면 된다.
<예제>
2 4 1 1
1 2 3 4 0
5 7 9 11 4
0 5 6 7 8
<계산 과정>
1 2 3 4
5 (6+1) (7+2) (8+3) (0+4)
(0+5) (0+6) (0+7) (0+8)
<복원>
1 2 3 4
5 6 7 8
첫 열을 기준으로 X, Y만큼 이동하여 겹친 부분을 더해주므로 반복문으로 인덱스 위치를 X, Y부터 시작하여 arr[i-X][j-Y]만큼을 빼주면 된다.
그러면 더해줬던 만큼 다시 위에서부터 빼주게 되어 배열을 복원하게 된다.