문제에서는 원본 배열을 줬고, 배열을 x축 y축으로 이동한 후의 배열까지 줬다.
그렇다면 기본 논리는 이동후의 배열에서 왔던 곳으로 다시 돌아가는 것이다. 그런데 이동후 겹쳤으면 그 수를 더하므로 겹쳤는지 겹치지 않았는지가 매우 중요하다. 문제의 첫번째 예제를 그림으로 표현하면 다음과 같이 겹치는 부분이 생긴다. 이 겹치는 부분은 다르게 관리를 해야 문제를 풀 수 있다.
import sys
input = sys.stdin.readline
h, w, x, y = map(int,input().split())
board = [list(map(int,input().split())) for _ in range(h + x)]
prototype = [[0 for _ in range(w)] for _ in range(h)]
check = [[0 for _ in range(w)] for _ in range(h)]
for i in range(h):
for j in range(w):
if i < h and j < w: check[i][j] += 1
if i + x < h and j + y < w: check[i+x][j+y] += 1
for i in range(h):
for j in range(w):
if check[i][j] == 1: prototype[i][j] = board[i][j]
elif check[i][j] == 2:
prototype[i][j] = board[i][j] - prototype[i-x][j-y]
for i in range(h):
print(*prototype[i])
위와 같이 나는 겹치는 부분과 겹치지 않는 부분을 판단하기 위해 이동한 곳에 +1을 해주는 방법을 썼다.
그 후에는 모든 배열을 돌면서 1인 부분은 이전 상태와 그대로 이므로 그대로 적어버리고, 2인 부분은 겹쳤다는 뜻이므로 그 값에서 이동전의 상태를 빼주면 원래의 상태가 나온다.
'알고리즘 > 백준' 카테고리의 다른 글
13334. 철로 (0) | 2022.06.10 |
---|---|
1195. 킥다운 (0) | 2022.06.09 |
15591. Mootube (0) | 2022.05.01 |
1914. 하노이 탑 (0) | 2022.04.27 |
10819. 차이를 최대로 (0) | 2022.04.24 |