PS

백준 16967번 배열 복원하기

남마허 2020. 2. 11. 22:06

https://www.acmicpc.net/problem/16967

 

16967번: 배열 복원하기

크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐진다. 즉, 배열 B의 (i, j)에 들어있는 값은 아래 3개 중 하나이다. (i, j)가 두 배열 모두에 포함되지 않으면, Bi,j = 0이다. (i, j)가 두 배열 모두에 포함되면, Bi,j = Ai,j + Ai-X,j-Y이다.

www.acmicpc.net

 

 

 

 

<접근방법>

단순 구현문제입니다.

문제에 나와있는 대로 구현하면 됩니다.

method1은 틀렸는데 왜 틀렸는지 모르겠습니다..

 

 

 


 

 

 

 

<코드>

#include <iostream>
#include <algorithm>
using namespace std;

int n, m, y, x;
int B[601][601];
int not_A[601][601];
int A[301][301];


//불합격
void method1() {
	for (int i = y; i < n; i++) {
		for (int j = x; j < m; j++) {
			not_A[i][j] = 1;
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (not_A[i][j] == 0) {
				A[i][j] = B[i][j];
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (not_A[i + y][j + x] == 0) {
				A[i][j] = B[i + y][j + x];
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << A[i][j] << ' ';
		}
		puts("");
	}
}

//합격
void method2() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (y <= i && i <= n && x <= j && j <= m) {
				A[i][j] = B[i][j] - A[i - y][j - x];
			}
			else {
				A[i][j] = B[i][j];
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << A[i][j] << ' ';
		}
		puts("");
	}
}

//개선
void method3() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (i >= y && j >= x) {
				B[i][j] -= B[i-y][j-x];
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << B[i][j] << ' ';
		}
		puts("");
	}
}

int main() {
	cin >> n >> m >> y >> x;
	for (int i = 0; i < n + y; i++) {
		for (int j = 0; j < m + x; j++) {
			cin >> B[i][j];
		}
	}

	method3();

	return 0;
}

 

 

 

 

 


 

 

<느낀 점>

-쉬운 방법은 얼마든지 있다

 

 

 

 

 

 

반응형