코딩/백준

[백준]16967번 배열 복원하기 - C/C++

최선을 다하는 2022. 1. 6. 17:29

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

 

16967번: 배열 복원하기

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

www.acmicpc.net

문제

크기가 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이다.
  • (i, j)가 두 배열 중 하나에 포함되면, Bi,j = Ai,j 또는 Ai-X,j-Y이다.

배열 B와 정수 X, Y가 주어졌을 때, 배열 A를 구해보자.

입력

첫째 줄에 네 정수 H, W, X, Y가 주어진다. 둘째 줄부터 H + X개의 줄에 배열 B의 원소가 주어진다.

항상 배열 A가 존재하는 경우만 입력으로 주어진다.

출력

총 H개의 줄에 배열 A의 원소를 출력한다.


원래의 배열에서 겹치는 부분만 다시 계산해주면 된다.

굳이 배열을 두개를 둘 필요 없이 변한 부분인 arr[X][Y]부터 arr[H][W]까지를 바꿔주면 되는데 단순하게 arr[i][j]에서 겹친 부분인 원래 배열의 arr[i-X][j-Y]를 빼주면 된다.

#include <iostream>
#include <algorithm>

using namespace std;
int H, W, X, Y;
int arr[601][601] = { 0 };

void solve() {
	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";
	}
}
int main() {
	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];
		}
	}
	solve();
	return 0;
}

 


오늘은 쉬운문제를 풀어볼까 하고 문제를 고르게 되었다. 쉬운문제도 실수하지 않고 빠르게 푸는 연습을 한다는 마음으로 집중해서 문제를 풀기 시작했는데 5분도 채 안걸려서 양심의 가책이 상당했다. 문제를 읽으면서 0인 부분으로 H와 W를 구하면 되겠다고 생각을 하고 읽고 있었는데 H 와 W 마저 주어졌다. H 와 W의 값이 주어지지 않아도 문제를 풀 수 있을 것 같다고 생각했다! 문제에서 제공된 입력에서 arr[H][W]이후로는 딱히 필요 없는 부분인 것 같다. 앞으로도 출제자의 의도를 잘 파악해서 필요한 정보를 확실히 파악하는 것이 좋아보인다!

'코딩 > 백준' 카테고리의 다른 글

[백준]24040번 예쁜케이크 - C/C++  (0) 2022.01.08
[백준]11724 연결 요소의 개수 - C/C++  (0) 2022.01.07
[백준]1043 거짓말 - C/C++  (1) 2022.01.05
[백준]10159번 저울  (2) 2022.01.04
[백준]12886 돌그룹  (3) 2022.01.03