def dfs(bomblist):
global N,result
while bomblist:
x,y = bomblist.pop()
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if (nx == 0 or nx == N-1) or (ny == 0 or ny ==N-1):
if arr[nx][ny] == 0:
break
else:
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if (nx == 0 or nx == N-1) or (ny == 0 or ny ==N-1):
arr[nx][ny] -= 1
result += 1
return
N = int(input())
dx = [-1,0,1,-1,1,-1,0,1]
dy = [-1,-1,-1,0,0,1,1,1]
arr = [list(input()) for _ in range(N)]
result = 0
if N >4:
result += (N-4)**2
bomb = []
for x in range(N):
for y in range(N):
if x == 1 or x == N-2:
if arr[x][y] == '#':
bomb.append((x,y))
else:
arr[x][y] = int(arr[x][y])
elif 1<x<N-2:
if y == 1 or y == N-2:
bomb.append((x,y))
else:
if arr[x][y] != '#':
arr[x][y] = int(arr[x][y])
else:
if arr[x][y] != '#':
arr[x][y] = int(arr[x][y])
dfs(bomb)
print(result)
지뢰찾기를 하는 문제이다. 테두리에만 숫자가 있고, 그 안은 파악되지않는 지뢰구역이 있다.
이 지뢰구역에서 최대로 설치가능한 지뢰의 개수를 구하는 문제이다.
먼저, 테두리에 직접적으로 닿아있는 칸들을 제외한 나머지 칸들은 전부 지뢰가 있다고 가정을 해야, 최대 지뢰를 구할 수 있다.
그리고 두번째로 테두리에 근접해있는 칸들을 기준으로 8칸을 탐색을 해서, 그 안에 0이 있다면, 해당 구역은 지뢰가 존재할수 없는 공간이니 넘어간다.
하지만, 0이 존재하지 않는 경우 지뢰가 존재하는 경우이니, 지뢰의 수를 1개 늘려주고, 해당 구역의 주변 8칸의 숫자를 1씩 줄여준다.
이걸 반복해준다.
여기서 쓴 코드적인 부분은 for else 문이다.
for문을 반복하면서, break를 한번도 마주치지 않으면 자동적으로 else문이 실행되는 것이다.
이걸 통해 따로 flag같은 True False 값 같은 분기점이 없이 진행이 가능했다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 2564 경비원 (0) | 2021.01.15 |
---|---|
[BOJ] 5569 출근 경로 (0) | 2021.01.15 |
[BOJ] 1058 친구 (0) | 2021.01.14 |
[BOJ] 10884 쉬운 계단 수 (0) | 2021.01.14 |
[BOJ] 1149 RGB 거리 (0) | 2021.01.14 |