ํ’€์ด


CCTV ์˜ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ์„œ ๊ฐ์‹œ ๋ฒ”์œ„์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด DFS ๋ฅผ ํ†ตํ•ด ์žฌ๊ท€์ ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

๋จผ์ € CCTV ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ฐ์‹œ ๋ฐฉํ–ฅ์„ ์ •์˜ํ•ด์ค€๋‹ค. ํ•œ๋ฒˆ์— ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€์ธ ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ CCTV ์˜ ๊ฐ์‹œ ๋ฐฉํ–ฅ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ๊ฐ์‹œ ๋ฐฉํ–ฅ์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ด์ค€ ๋’ค ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋”ฐ๋ผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ์‹ธ์ค€๋‹ค.

์ดํ›„ ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด์„œ CCTV ์˜ ์ข…๋ฅ˜์™€ ์ขŒํ‘œ๋ฅผ cctvs ์— ์ €์žฅํ•ด์ค€ ๋’ค dfs ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๊ฐ CCTV ์˜ ๋ฐฉํ–ฅ๊ณผ ์ขŒํ‘œ์— ๋”ฐ๋ผ์„œ 2 ์ฐจ์›Œแ†ซ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•ด ์ค„ watch ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

์ดํ›„ ๊ฐ CCTV ์˜ ์ข…๋ฅ˜์™€ 2 ์ฐจ์› ๋ฐฐ์—ด์„ ๋ฐ›๊ณ  CCTV ์˜ ์ข…๋ฅ˜๋ฅผ cam_num ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ๋’ค cam_num ์„ ์ธ๋ฑ์Šค๋กœ ํ™œ์šฉํ•ด direction ์—์„œ ๊ฐ์‹œ ๋ฐฉํ–ฅ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด watch ํ•จ์ˆ˜์™€ dfs ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 2 ์ฐจ์› ๋ฐฐ์—ด์— 2๋ฒˆ CCTV ์™€ 4๋ฒˆ CCTV ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ,

2๋ฒˆ CCTV ๋Š” [[0, 1], [2, 3]] ๋กœ ์ด 2 ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๊ณ 

4๋ฒˆ CCTV ๋Š” [[3, 0, 2], [1, 3, 0], [0, 2, 1], [2, 1, 3]] ๋กœ ์ด 4 ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿด ๊ฒฝ์šฐ cctvs ์—๋Š” [[2, x, y], [4, x, y]] ๊ฐ€ ์ €์žฅ๋  ๊ฒƒ์ด๋‹ค.

dfs ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ฒ˜แ†บ ๋ฒ„แ†ซ์งธ CCTV ์ธ 2๋ฒˆ CCTV ์— ๋Œ€ํ•œ dfs ๊ฐ€ ์‹คํ–‰๋˜๊ณ ,

for d in direction[can_num] = for d in direction[2] = for d in [[0, 1], [2, 3]] ๊ฐ€ ๋œ๋‹ค.

์ดํ›„ d = [0, 1] ์— ๋Œ€ํ•œ watch ํ•จ์ˆ˜์™€ dfs ๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ watch ์—์„ ,

for d in direction = for d in [0, 1] ์ด ๋˜๊ณ  ๊ฐ d ์— ๋”ฐ๋ผ์„œ ๊ฐ์‹œ ๋ฒ”์œ„๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค dfs ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด,

for d in [[0, 1], [2, 3]]:

watch(d)

for d in [[3, 0, 2], [1, 3, 0], [0, 2, 1], [2, 1, 3]]:

    watch(d)

์— ๋Œ€ํ•œ 2์ค‘ ๋ฐ˜๋ณต๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฒซ DFS ๋ฌธ์ œ์—ฌ์„œ ์—ญ์‹œ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๊ณ  ์ถ”ํ›„์— ํ’€์–ด๋ณผ ๋ฌธ์ œ์— ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์†Œ์Šค์ฝ”๋“œ


# ๊ฐ์‹œ
 
import sys
import copy
input = sys.stdin.readline
 
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
direction = [[], [[0], [1], [2], [3]], [[0, 1], [2, 3]], [[0, 2], [2, 1], [1, 3], [3, 0]], [[3, 0, 2], [1, 3, 0], [0, 2, 1], [0, 2, 1], [2, 1, 3]], [[0, 1, 2, 3]]]  # CCTV ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ๊ฐ์‹œ ๋ฒ”์œ„๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์„ ์–ธ
 
def watch(x, y, direction, temp):
    for d in direction:  # ๋ฐฐ์น˜์— ๋”ฐ๋ฅธ ๊ฐ์‹œ ๋ฐฉํ–ฅ ex) 2๋ฒˆ์˜ 1๋ฒˆ์งธ ๊ฐ์‹œ ๊ฒฝ์šฐ์˜ ์ˆ˜ [0, 1]
        nx = x
        ny = y
        while True:
            nx += dx[d]
            ny += dy[d]
            if 0 <= nx < n and 0 <= ny < m and temp[nx][ny] != 6:
                if temp[nx][ny] == 0:
                    temp[nx][ny] = "#"
            else:
                break
 
def dfs(office, cctv):
    global ans
    temp = copy.deepcopy(office)  # ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋”ฐ๋ผ ๊ฐ์‹œ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์ œ๋ฅผ ์‚ฌ์šฉ
    if cctv == len(cctvs):  # ์ด CCTV ๊ฐœ์ˆ˜ ๋งŒํผ์˜ ์žฌ๊ท€์— ๋“ค์–ด์™”์„ ๊ฒฝ์šฐ 
        c = 0
        for i in temp:
            c += i.count(0)
        ans = min(ans, c)
        return
 
    cam_num, x, y = cctvs[cctv]
 
    for d in direction[cam_num]:  # CCTV ์ข…๋ฅ˜์— ๋”ฐ๋ฅธ ๊ฐ์‹œ ๋ฐฉํ–ฅ ex) 2๋ฒˆ ์ผ ๊ฒฝ์šฐ [[0, 1], [2, 3]]
        watch(x, y, d, temp)  # [0, 1] ์— ๋Œ€ํ•œ ๊ฐ์‹œ๋ฒ”์œ„ and [2, 3] ์— ๋Œ€ํ•œ ๊ฐ์‹œ๋ฒ”์œ„
        dfs(temp, cctv+1)  # ๋‹ค์Œ CCTV์— ๋Œ€ํ•œ DFS
        temp = copy.deepcopy(office)
 
n, m = map(int, input().split())
office = []
cctvs = []  # ์‚ฌ๋ฌด์‹ค์— ์žˆ๋Š” CCTV ๋ณ„ [์ข…๋ฅ˜, x, y]
ans = n * m
for i in range(n):
    line = list(map(int, input().split()))
    office.append(line)
    for j in range(m):
        if 0 < line[j] < 6:
            cctvs.append((line[j], i, j))
 
dfs(office, 0)  # CCTV ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— DFS ์‚ฌ์šฉ
print(ans)

References