반응형
문제
크기가 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의 원소를 출력한다.
제한
- 2 ≤ H, W ≤ 300
- 1 ≤ X < H
- 1 ≤ Y < W
- 0 ≤ Bi,j ≤ 1,000
조건 잘 고려해서 풀면되는 짱구아픈 머리..
#include <iostream>
#include <string.h>
#include <deque>
#include<queue>
#include<vector>
#include<map>
#include <algorithm>
using namespace std;
int H, W, X, Y;
int B[600][600];
int A[300][300];
int main(void)
{
cin >> H >> W >> X >> Y;
for (int i = 0; i < H + X; i++)
{
for (int j = 0; j < W + Y; j++)
{
cin >> B[i][j];
if (0 <= i && i < X && 0 <= j && j < W)
{
A[i][j] = B[i][j];
}
if (X <= i && X < H && 0 <= j && j < Y)
{
A[i][j] = B[i][j];
}
if (X <= i && X < H && Y <= j && j < W + Y)
{
A[i][j] = B[i][j] - A[i - X][j - Y];
}
if (H <= i && i < H + X && Y <= j && j < W + Y)
{
A[i-X][j-Y] = B[i][j];
}
}
}
for (int i = 0; i < H; i++)
{
for (int j = 0; j < W; j++)
{
cout << A[i][j] << " ";
}
cout << endl;
}
}
반응형
'Algorithm' 카테고리의 다른 글
백준 3584번 가장 가까운 공통 조상 (0) | 2020.09.16 |
---|---|
백준 1655번 가운데를 말해요 (0) | 2020.09.16 |
백준 1647번 도시 분할 계획 (0) | 2020.09.15 |
백준 16946번 벽 부수고 이동하기 4 (0) | 2020.09.14 |
백준 3111번 검열 (0) | 2020.09.14 |