[백준] 16967: 배열 복원하기

JIN·2022년 1월 21일
0

구현

배열 복원하기

문제 좀 잘 읽어라 내 자신아...

2 4 1 1
1 2 3 4 0
5 7 9 11 4
0 5 6 7 8

가 있다면 A 배열은 x 1칸 y 1칸 이동하여 다음과 같이 변형된다.

7, 9, 11, 4
5, 6, 7, 8

이 그림에서 겹치는 부분은 x+h, y+w 의 범위 내인 7, 9, 11이 된다.
그래서 "(i, j)가 두 배열 모두에 포함되면,

Bi,j = Ai,j + Ai-X,j-Y

이다." 조건에 따라, A 배열은 다음과 같이 갱신된다.
처음에는 그림만 보고 눈에 보이는 대로 문제를 제대로 읽지 않고

Ai,j = Bi,j + Bi-X,j-Y

라고 식을 세워 계속 틀렸었다; 이 문제는 다음 반례로 알 수 있다.

3 3 1 1
1 1 1 0
1 3 2 1
1 2 3 1
0 1 1 1

답이 다르게 나옴 ~~암튼 문제를 잘 읽자 멍충아 ~~
import sys
input = sys.stdin.readline
h, w, x, y = map(int, input().split())
B  = []
for i in range(h+x):
	B.append(list(map(int, input().split())))

A = [[0]*(w+y) for _ in range(h+x)]
for i in range(h+x):
	for j in range(w+y):
    		# 겹치지 않는 부분은 그대로 들어감 , 겹치는 부분은 B 배열에서 A 배배열의 x, y만큼 돌아가서 빼줌
		if x <= i < x+h and y <= j < y+w:
			A[i][j] = B[i][j] - A[i-x][j-y]
		elif i < x or i >= x+h:
			A[i][j] = B[i][j]
		elif j < y or j >= y+w:
			A[i][j] = B[i][j]


for i in range(h):
	for j in range(w):
		print(A[i][j], end = ' ')
	print()
profile
배우고 적용하고 개선하기

0개의 댓글