백준 16946번
✔️ 문제 풀이
◾ 빈공간을 그룹으로 묶어 계산에 활용
- 모든 벽에 대해서 매번 인접한 빈공간을 계산하면 시간초과 발생
- 하나로 묶여있는 빈공간은 각각 번호를 부여해주고, 각 번호에 해당하는 공간의 넓이를 계산한다.
⇒ 이 과정을 한 번 수행해서 값을 저장해놓으면, 벽에 인접한 빈공간의 그룹을 검사하고 그 값만 더해서 result 배열을 업데이트 해주면 됨으로 실행 시간이 훨씬 줄어든다
최종 제출 코드
from collections import deque
n, m = map(int, input().split())
matrix = []
walls = []
empty = []
empty_key = []
visited = [[0] * m for _ in range(n)]
result = [[0] * m for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(n):
row = input()
for j in range(m):
if row[j] == '1':
walls.append((j, i))
else:
empty.append((j, i))
matrix.append(row)
def calculate_empty(values):
xv, yv = values
key = len(empty_key) + 1
visited[yv][xv] = key
queue = deque()
queue.append((xv, yv))
count = 1
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= m or ny >= n:
continue
if visited[ny][nx] == 0 and matrix[ny][nx] == '0':
queue.append((nx, ny))
visited[ny][nx] = key
count += 1
count %= 10
empty_key.append(count)
def calculate_walls(values):
x, y = values
keys = []
sum_value = 1
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= m or ny >= n:
continue
if visited[ny][nx] and visited[ny][nx] not in keys:
keys.append(visited[ny][nx])
sum_value += empty_key[visited[ny][nx] - 1]%10
result[y][x] = sum_value%10
for x, y in empty:
if not visited[y][x]:
calculate_empty((x, y))
for wall in walls:
calculate_walls(wall)
for i in range(n):
for j in range(m):
print(result[i][j], end='')
print()
✔️ 실행 결과
