본문 바로가기

알고리즘/백준

16968. 배열 복원하기

문제에서는 원본 배열을 줬고, 배열을 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