오답노트

[시뮬레이션] BOJ 16967번 배열 복원하기 본문

C,C++/코딩테스트

[시뮬레이션] BOJ 16967번 배열 복원하기

권멋져 2022. 5. 26. 18:14
https://www.acmicpc.net/problem/16967
 

16967번: 배열 복원하기

크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐

www.acmicpc.net

- 문제 파악

배열 A의 크기 H와 W 그리고 배열 A 와 배열 A를 오른쪽으로 X 칸, 아래로 Y 칸 움직인 배열 B 합친 H+X x W+Y 배열C를 입력 받는데 입력 받은 배열로 부터 배열 A를 출력하라

 

- 정답

C[i][j]에서 i 가 0이고 j 가 0부터 w-1 까지는 배열 A와 같다.

그러므로 i가 1일때 부터 A[i][j] = C[i][j] - A[i-x][j-y]  이다.

그리고 겹치지 않는 부분은 예외 처리한다.

 

#include "bits/stdc++.h"

using namespace std;

int arr[603][603];
int arr_src[301][301];

int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	fill(arr_ans[0], arr_ans[0] + (301 * 301), -1);

	int h, w, x, y;

	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];
		}
	}


	memcpy(arr_src[0], arr[0], sizeof(int) * w);

	for (int i = 1; i < h; i++)
	{
		for (int j = 0; j < w; j++)
		{
			if (j < y)
				arr_src[i][j] = arr[i][j];
			else
				arr_src[i][j] = arr[i][j] - arr_src[i - x][j - y];				
		}
	}

	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < w; j++)	
			cout << arr_src[i][j] << " ";


		cout << "\n";

		
	}


}