문제링크 : https://www.acmicpc.net/problem/16967
16967번: 배열 복원하기
크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int H, W, X, Y;
int arr[601][601];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
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];
}
}
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";
}
return 0;
}
단순 구현 문제이다.
기존 배열을 주어진 조건에 따라 이동하여 만들어진 배열에 대해 중복하여 더해진 것 만큼 빼주면 된다.
<예제>
2 4 1 1
1 2 3 4 0
5 7 9 11 4
0 5 6 7 8
<계산 과정>
1 2 3 4
5 (6+1) (7+2) (8+3) (0+4)
(0+5) (0+6) (0+7) (0+8)
<복원>
1 2 3 4
5 6 7 8
첫 열을 기준으로 X, Y만큼 이동하여 겹친 부분을 더해주므로 반복문으로 인덱스 위치를 X, Y부터 시작하여 arr[i-X][j-Y]만큼을 빼주면 된다.
그러면 더해줬던 만큼 다시 위에서부터 빼주게 되어 배열을 복원하게 된다.
'백준 > 실버' 카테고리의 다른 글
[백준 16493번] 최대 페이지 수 (C++) (0) | 2023.10.02 |
---|---|
[백준 1535번] 안녕 (C++) (0) | 2023.10.01 |
[백준 1935번] 후위 표기식2 (C++) (0) | 2023.09.24 |
[백준 12847번] 꿀 아르바이트 (C++) (0) | 2023.09.22 |
[백준 11052번] 카드 구매하기 (C++) (0) | 2023.09.19 |