import copy

def make_map(row, colum) :
  #맵 정보 가져오기 && 테두리에 -1 둘러주기
  data_list = []
  
  for i in range(row+2) :           #맨 위, 맨 아래 2줄 더 추가
    if i == 0 or i == row + 1 :     #맨 위인경우, 맨 아래인 경우
      temp = [] 
      for i in range(colum + 2) :   #-1로 테두리 만들어주기(양 옆으로도 1개씩 총 2열 추가 생성되므로 +2)
        temp.append(-1)
      data_list.append(temp)
    else:
      data_list.append(list(map(int, input().split())))   #입력 데이터 삽입
      data_list[-1].insert(0, -1)                         #맨 앞에 테두리 -1 추가
      data_list[-1].append(-1)                            #맨 뒤에 테두리 -1 추가
  return data_list                                        #제작된 리스트 반환


def move_all_direction(row, colum, map_data) :
  #맵에 있는 1,1 좌표 부터 #위, 오른쪽, 아래, 왼쪽 방문
  result_list = copy.deepcopy(map_data)
    
  dx = [-1, 0, 1, 0]              #위 0, 오른쪽 1, 아래 2, 왼쪽 3
  dy = [ 0, 1, 0, -1]
  
  for x in range(1, row+1) :        #테두리에 -1 둘러져서 1부터 +1 까지 반복
    for y in range(1, colum+1) :
      now_value = map_data[x][y]    #현재 좌표의 값 저장
      for d in range(4) :           #위 0, 오른쪽 1, 아래 2, 왼쪽 3
        next_x = x + dx[d]          #위, 오른쪽, 아래, 왼쪽 갈 x
        next_y = y + dy[d]          #위, 오른쪽, 아래, 왼쪽 갈 y
        
        if map_data[next_x][next_y] != -1 :
          result_list[next_x][next_y] += now_value
  
  return result_list
  
if __name__ == "__main__":
  row, colum = map(int, input().split())
  data_list = []
  data_list = make_map(row, colum)                         #맵 데이터 받아오기 & 테두리 -1 추가
  
  time = int(input())
  
  for i in range(time) :
    data_list = move_all_direction(row, colum, data_list)
  
  for i in range(1, row+1) :
    print(" ".join(map(str, data_list[i][1:-1])))

문제


세로 길이 N, 가로 길이 M 인 2차원 배열이 주어진다.

이 배열의 각 칸에 들어있는 수는 1 초에 한 번 씩 자기 자신을 복사해서 상하좌우로 인접한 칸들에 더해준다.

t 초가 지난 후 배열의 상태를 출력하여라.

입력


첫 줄에 N, M 이 주어진다.

두 번째 줄부터 N 줄에 걸쳐 배열의 값이 주어진다.

마지막 줄에 t 가 주어진다.

(1 ≤ N, M ≤ 100, 1 ≤ 배열의 값, t ≤ 10)

출력


t 초 후 배열을 출력한다.

입력의 예 1

3 4
5 1 3 4
2 5 1 2
7 8 3 1
2

출력의 예 1

41 48 46 26
61 87 61 37
59 70 56 27

입력의 예 2

2 5
1 0 1 0 1
0 1 0 1 0
5

출력의 예 2

226 399 436 399 226
235 381 454 381 235

입력의 예 3

3 3
2 4 2
4 2 4
2 4 2
3

출력의 예 3

126 166 126
166 250 166
126 166 126

입력의 예 4

3 4
7 8 1 2
6 9 7 5
8 8 3 8
10

출력의 예 4

4381720 6997542 6881404 4197186
6212937 9918239 9758514 5949716
4402841 7031994 6916199 4218862

 

풀이

 - 1. make_map()을 통해서 맵 테두리에 -1을 둘러준다

 - 2. time 만큼 반복

 - 3.  위 0, 오른쪽 1, 아래 2, 왼쪽 3 이동해줌

 - 4. n칸 확산 하면서 기존 값에 계속 더해줘야 하기 때문에 그냥 copy.deepcopy(map_data)를 이용해서

      2차원 리스트 깊은 복사 떠줌

 

 

공기청정기 - 2차원 확산(상하좌우 이동, 깊은 복사 copy.deepcopy)