문제
크기가 H x W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) 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
예제 입출력

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와 B의 배열을 나타내기 위해 vector를 사용하여 2차원 배열을 나타내었고 H,W,X,Y를 입력받은것을 토대로 크기를 정해주었다. B의 배열을 입력받은 후 B의 배열중 B[X][Y]부터 A의 배열이 겹친다는 것을 알게 되었고 i와 j를 사용한 2중 for문을 만들어 i가 X보다작거나 j가 Y보다 작을경우 배열 B를 A에 그대로 넣어주었고 그렇지 않을 경우는 A배열 두개가 겹친 경우이므로 B[i][j] - A[i-X][j-Y]를 해주어 배열 A에 넣어주었다. 말로 설명하면 이해가 잘 되지 않기에 직접 코드를 보면서 이해하는게 쉽다.
최종 코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
int H, W, X, Y;
cin >> H >> W >> X >> Y;
vector<vector<int>> A(H, vector<int>(W, 0));
vector<vector<int>>B(H + X, vector<int>(W + Y, 0));
for (int i = 0; i < H + X; i++) {
for (int j = 0; j < W + Y; j++) {
cin >> B[i][j];
}
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (i < X || j < Y)
A[i][j] = B[i][j];
else
A[i][j] = B[i][j] - A[i-X][j-Y];
}
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
cout << A[i][j] << ' ';
}
cout << "\n";
}
}
'[Baekjoon] C++ > Silver' 카테고리의 다른 글
[baekjoon] 10815 : 숫자 카드 (C++) (0) | 2024.03.13 |
---|---|
[baekjoon] 14888 : 연산자 끼워넣기 (C++) (0) | 2024.03.09 |
[baekjoon] 1406 : 에디터 (C++) (0) | 2023.09.05 |
[baekjoon] 5635 : 생일 (C++) (0) | 2023.09.03 |
[baekjoon] 2164 : 카드 2 (C++) (0) | 2023.09.03 |