CS/알고리즘_문제풀이(파이썬)

N칸 확산

Jedy_Kim 2021. 6. 13. 16:23
728x90

문제

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

이 배열의 각 칸에 들어있는 수는 1 초에 한 번 씩 자기 자신을 복사해서 x, y좌표와의 거리가 1이상 k이하인 칸들에 더해준다. 두 점 (x1, y1), (x2, y2)의 거리는 |x1-x2| + |y1-y2|로 구한다.

t 초가 지난 후 배열의 상태를 출력하여라. 중간 계산 과정과 최종 결과의 모든 수는 int 로 표현 가능함이 보장된다.

입력

첫 줄에 N, M, k 가 주어진다.

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

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

(1 ≤ N, M ≤ 5, 1 ≤ k ≤ 4, 1 ≤ 배열의 값 ≤ 10, 1 ≤ t ≤ 3)

출력

t 초 후 배열을 출력한다.

입력의 예 1

3 4 2

5 1 3 4

2 5 1 2

7 8 3 1

2

출력의 예 1

172 212 204 133

206 279 257 171

177 232 217 138

입력의 예 2

3 3 1

2 4 2

4 2 4

2 4 2

3

출력의 예 2

126 166 126

166 250 166

126 166 126

입력의 예 3

2 5 2

1 0 1 0 1

0 1 0 1 0

5

출력의 예 3

4693 6930 7976 6930 4693

4689 6931 7968 6931 4689

입력의 예 4

3 4 1

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import sys
 
# 이 배열의 각 칸에 들어있는 수는 1 초에 한 번 씩 자기 자신을 복사해서 x, y좌표와의 거리가 1이상 k이하인 칸들에 더해준다. 
# 두 점 (x1, y1), (x2, y2)의 거리는 |x1-x2| + |y1-y2|로 구한다
 
# 절댓값 함수
def abs(x):
  if x > 0return x
  elsereturn -x
  
def spread(row, col):
  
  global n, m, k, arr, getArr
  sum = 0 
  for i in range((row-k), (row+k)+1):
    if i < 1 or i > n: continue
    for j in range((col-k), (col+k)+1):
      if j < 1 or j > m: continue
      if i==row and j==col: continue
      # print(i, j)
      dist = abs(row-i) + abs(col-j)
      if dist >= 1 and dist <= k:
        sum += arr[i][j]
  sum += arr[row][col]
  getArr[row-1][col-1= sum
 
      
 
def doit():
  global n, m, k, arr, getArr
  
  for row in range(1, n+1):
    for col in range(1, m+1):
      spread(row, col) 
      
def upgrade_frame():
  global n, m, k, arr, getArr
  
  for i in range(n):
    for j in range(m):
      arr[i+1][j+1= getArr[i][j]
 
if __name__ == "__main__":
  input = sys.stdin.readline
  n, m, k = map(int, input().split())
  arr     = [[0]*(m+2for _ in range(n+2)]
  getArr  = [list(map(int, input().split())) for _ in range(n)]
  t       = int(input()) 
  
  upgrade_frame()
      
       
  for _ in range(t):
    doit()
    upgrade_frame()
    
    
  for i in getArr:
    for j in i:
      print(j, end=' ')
    print()
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

확산 알고리즘  (0) 2021.06.13
밀기 알고리즘 2  (0) 2021.06.13
2차원 확산  (0) 2021.06.12
1차원 확산  (0) 2021.06.12
2차원 밀기  (0) 2021.06.12