๐ฅธ ๋ฌธ์
15683๋ฒ: ๊ฐ์
์คํํธ๋งํฌ์ ์ฌ๋ฌด์ค์ 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ N×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ์ด K๊ฐ์ CCTV๊ฐ ์ค์น๋์ด์ ธ ์๋๋ฐ, CCTV๋ 5๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ๊ฐ CCTV๊ฐ ๊ฐ
www.acmicpc.net
๐ฅณ ํด์ค ๋ฐ ํ์ด
input size๋ฅผ ๊ณ์ฐํด๋ณด๋ ๋ธ๋ฃจํธ ํฌ์ค๊ฐ ๊ฐ๋ฅํ ๋ฌธ์ ์๊ณ ,
4^8(๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์) * board์ ํฌ๊ธฐ (8 * 8) ์ ๋๊ฐ ์ต๋ ๊ณ์ฐ ๋น๋์ ์ ๋์ฌ์ ์์ ํ์์ผ๋ก ์งํํ ์ ์์๋ค.
์ ์ฒด ๊ฒฝ์ฐ์ ์(4๊ฐ์ง ์ผ์ด์ค (๋์๋จ๋ถ) ** 8(CCTV์ ์ต๋ ๊ฐ์))๋ฅผ ์ด๋ป๊ฒ ๋๋ฉด ์ข์์ง ๊ณ ๋ฏผํ๋๋ฐ,
๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ทธ๋ฅ ์ซ์๋ก ๊ฐ์ ํ๊ณ 4^len(cctv) ๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ ค์คฌ๋๋ ํธํ๊ฒ ๊ณ์ฐํ ์ ์์๋ค.
ํต์ฌ์ ์๋์ฒ๋ผ curr ๋ณ์๋ฅผ ์ค๋ณต๋์ง ์๊ฒ ์ฌ์กฐ์ ํด์ฃผ๋ ๊ณผ์ ์ด๋ค. (4๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๊ฐ๋ฅํ๋ 4์ง๋ฒ์ผ๋ก ์ด์ฉํ๋ ๋๋)
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1] # ๋จ, ๋, ๋ถ, ์
# ...
for k in range(4^len(cctv))
curr = k
for i in range(len(cctv))
d = curr % 4 # dx, dy์์์ ๋ฐฉํฅ ์ค ํ๋ ์ ํ
# ... ๊ณ์ฐ
curr //= 4 # ๋ค์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ํ curr ์กฐ์
๐ ์์ฑ ์ฝ๋
n, m = map(int, input().split())
origin_board = [[0] * m for _ in range(n)] # ์ต์ด์ ์
๋ ฅ๋ฐ์ board๋ฅผ ์ ์ฅํ ๋ณ์
current_board = [[0] * m for _ in range(n)] # ์ฌ๊ฐ ์ง๋์ ๊ฐ์๋ฅผ ์ธ๊ธฐ ์ํด ์ฌ์ฉํ ๋ณ์
cctv = [] # cctv์ ์ขํ๋ฅผ ์ ์ฅํ ๋ณ์
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1] # ๋จ, ๋, ๋ถ, ์
# -----------------------------------------------------------------------
def is_out_of_bound(x, y): # Out Of Bounds ํ์ธ
return x < 0 or x >= n or y < 0 or y >= m
# (x, y)์์ d ๋ฐฉํฅ์ผ๋ก ๋ฒฝ์ ๋ง๋๊ธฐ ์ ๊น์ง ๋ฐฉ๋ฌธํ๋ ๋ชจ๋ ๋น์นธ์ 7๋ก ๋ฐฉ๋ฌธํ์ ํด์ค
def update_board(x, y, d):
d %= 4
while True:
x += dx[d]
y += dy[d]
if is_out_of_bound(x, y) or current_board[x][y] == 6:
return # ๋ฒฝ์ ๋ง๋๊ฑฐ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ ๋๋ ํ์ ์ค์ง
if current_board[x][y] != 0:
continue # ํด๋น ์นธ์ cctv๊ฐ ์์ ๊ฒฝ์ฐ์๋ ๋์ด๊ฐ๊ธฐ
current_board[x][y] = 7 # ๋น์นธ์ 7๋ก ๋ฎ์
def solution():
min_size = 0 # ์ฌ๊ฐ ์ง๋์ ์ต์ ํฌ๊ธฐ (= ๋ต)
for i in range(n):
row = list(map(int, input().split()))
for j in range(m):
origin_board[i][j] = row[j]
if 1 <= origin_board[i][j] <= 5:
cctv.append((i, j))
if origin_board[i][j] == 0:
min_size += 1
# 4^(len(cctv)) ๋งํผ ๋ฐ๋ณต
for k in range(4 ** (len(cctv))):
# ์ผ๋จ ๋ณต์ฌ (์ด๊ธฐํ ๊ณผ์ )
for i in range(n):
for j in range(m):
current_board[i][j] = origin_board[i][j]
curr = k
for i in range(len(cctv)):
x, y = cctv[i]
d = curr % 4 # 0, 1, 2, 3 ์ค ํ๋
if origin_board[x][y] == 1:
update_board(x, y, d)
elif origin_board[x][y] == 2:
update_board(x, y, d)
update_board(x, y, d + 2)
elif origin_board[x][y] == 3:
update_board(x, y, d)
update_board(x, y, d + 1)
elif origin_board[x][y] == 4:
update_board(x, y, d)
update_board(x, y, d + 1)
update_board(x, y, d + 2)
else:
update_board(x, y, d)
update_board(x, y, d + 1)
update_board(x, y, d + 2)
update_board(x, y, d + 3)
curr //= 4
min_size = min(sum(current_board[i][j] == 0 for i in range(n) for j in range(m)), min_size)
return min_size
print(solution())