선택은 나의 것

[BOJ 백준] 16967번 배열 복원하기 본문

☽ Algorithm/BOJ

[BOJ 백준] 16967번 배열 복원하기

Algoribi 2021. 12. 9. 03:15

문제

BOJ 16967 : 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 x W 크기의 배열 A를 X, Y만큼 움직여서 그 값을 더해 만든 배열 B가 있다. H, W, X, Y의 값과 배열 B가 주어졌을 때 원래의 배열 A를 구하는 문제이다.

 위와 같이 그림을 그려보면 규칙이 보인다. 겹쳐지는 사각형이 처음으로 등장하는 좌표를 (i, j)라고 했을 때 배열 A에서의 이 위치의 원래 값과 좌표 (i - x, j - y)의 값이 합쳐진 모양새다. 따라서 (i, j)의 값 - (i - x, j - y)의 값을 해주면 사각형이 겹쳐지는 부분의 값을 쉽게 구할 수 있다.

코드

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int h, w, x, y, t, num[305][305];
    cin >> h >> w >> x >> y;

    for (int i = 0; i < h + x; i++) {
        for (int j = 0; j < w + y; j++) {
            cin >> t;
            if (i < h && j < w)
                num[i][j] = t;
        }
    }
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            if (i >= x && j >= y)
                num[i][j] -= num[i - x][j - y];
            cout << num[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}

 

깃 허브 주소 : https://github.com/algoribi/algorithm-study

Comments