X, Y만큼 이동한 뒤에 더했다는 건 다시 X, Y만큼 이동한 뒤에 빼주면 된다는 것이다.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int H, W, X, Y;
cin >> H >> W >> X >> Y;
vector<vector<int>> vec(H + X, vector<int>(W + Y));
for (int i = 0; i < H + X; ++i)
for (int j = 0; j < W + Y; ++j)
{
int k;
cin >> k;
vec[i][j] = k;
}
for (int i = 0; i < H; ++i)
{
for (int j = 0; j < W; ++j)
{
cout << vec[i][j] << " ";
vec[i + X][j + Y] -= vec[i][j];
}
cout << "\n";
}
return 0;
}
사실 H, W만큼의 크기만 있어도 된다. 입력을 버리는 과정, 빼는 과정에서 범위를 처리하는 게 귀찮아서 H+X, W+Y만큼의 크기를 선언하여 풀었다.
딱히 메모리, 시간을 생각하고 작성한 건 아니지만 혹시나 하는 마음에 순위를 찾아봤다. 난이도, 인원수를 생각하면 지난번보다는 임팩트가 적지만 그래도 만족스럽다. '좀 더 메모리를 생각하고 작성했다면 더 높은 순위를 얻을 수 있지 않았을까?' 싶기도 하다.