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;
}
<느낀 점>
-쉬운 방법은 얼마든지 있다
반응형