1 minute read

16967번 : 배열 복원하기

문제 링크

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

문제 설명

크기가 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의 원소를 출력한다.

문제풀이

0 ~ H행, 0 ~ W열까지 순차적으로 조회하면서 겹쳐지는 부분이 아닐 경우에는 그대로 저장, 겹쳐지는 부분이면 입력배열 - 결과배열의 해당 부분을 빼서 저장

H, W, X, Y = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(H+X)]
result_arr = [[0 for _ in range(W)] for _ in range(H)]

for i in range(H) :
    for j in range(W) :
        if X <= i and Y <= j :
            result_arr[i][j] = arr[i][j] - result_arr[i-X][j-Y]
        else : 
            result_arr[i][j] = arr[i][j]

for i in range(H) :
    print(" ".join(map(str, result_arr[i])))

Comments