[BOJ][๐ก4][๋ฐฑ์ค#15683] ๊ฐ์
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์คํํธ๋งํฌ์ ์ฌ๋ฌด์ค์ 1ร1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ NรM ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ์ด K๊ฐ์ CCTV๊ฐ ์ค์น๋์ด์ ธ ์๋๋ฐ, CCTV๋ย 5๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ๊ฐ CCTV๊ฐ ๊ฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
1๋ฒ 2๋ฒ 3๋ฒ 4๋ฒ 5๋ฒ
1๋ฒ CCTV๋ ํ ์ชฝ ๋ฐฉํฅ๋ง ๊ฐ์ํ ์ ์๋ค. 2๋ฒ๊ณผ 3๋ฒ์ ๋ ๋ฐฉํฅ์ ๊ฐ์ํ ์ ์๋๋ฐ, 2๋ฒ์ ๊ฐ์ํ๋ ๋ฐฉํฅ์ด ์๋ก ๋ฐ๋๋ฐฉํฅ์ด์ด์ผ ํ๊ณ , 3๋ฒ์ ์ง๊ฐ ๋ฐฉํฅ์ด์ด์ผ ํ๋ค. 4๋ฒ์ ์ธ ๋ฐฉํฅ, 5๋ฒ์ ๋ค ๋ฐฉํฅ์ ๊ฐ์ํ ์ ์๋ค. CCTV๋ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ ์๋ ์นธ ์ ์ฒด๋ฅผ ๊ฐ์ํ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ๋ฒฝ์ด ์๋๋ฐ, CCTV๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค. CCTV๊ฐ ๊ฐ์ํ ์ ์๋ ์์ญ์ ์ฌ๊ฐ์ง๋๋ผ๊ณ ํ๋ค. CCTV๋ ํ์ ์ํฌ ์ ์๋๋ฐ, ํ์ ์ ํญ์ 90๋ ๋ฐฉํฅ์ผ๋ก ํด์ผ ํ๋ฉฐ, ๊ฐ์ํ๋ ค๊ณ ํ๋ ๋ฐฉํฅ์ด ๊ฐ๋ก ๋๋ ์ธ๋ก ๋ฐฉํฅ์ด์ด์ผ ํ๋ค.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0 ์ง๋์์ 0์ ๋น ์นธ, 6์ ๋ฒฝ, 1~5๋ CCTV์ ๋ฒํธ์ด๋ค. ์์ ์์์์ 1๋ฒ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ๊ฐ์ํ ์ ์๋ ์์ญ์ โ#โ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 # 6 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
# 1 0 6 0
0 0 0 0 0 0
0 0 # 0 0 0 0 0 # 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 # 0 0 0
โ โ โ โ
CCTV๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๊ธฐ ๋๋ฌธ์, 1๋ฒ์ด โ ๋ฐฉํฅ์ ๊ฐ์ํ๊ณ ์์ ๋๋ 6์ ์ค๋ฅธ์ชฝ์ ์๋ ์นธ์ ๊ฐ์ํ ์ ์๋ค.
0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 6 0 0 6 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 5 ์์ ์์์์ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ ์์๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
0 0 0 0 0 #
2 # # #
0 0 0 0 6 # 0 6 # # 2 # 0 0 0 0 0 #
# # # # 5
0 0 0 0 0 #
2 # # #
0 0 0 0 6 # 0 6 0 0 2 # 0 0 0 0 # #
# # # # 5
0 # 0 0 0 # 0 2 0 0 0 # 0 # 0 0 6 # 0 6 # # 2 # 0 0 0 0 0 #
# # # # 5
0 # 0 0 0 # 0 2 0 0 0 # 0 # 0 0 6 # 0 6 0 0 2 # 0 0 0 0 # #
# # # # 5
์ผ์ชฝ ์๋จ 2: โ, ์ค๋ฅธ์ชฝ ํ๋จ 2:ย โ ์ผ์ชฝ ์๋จ 2: โ, ์ค๋ฅธ์ชฝ ํ๋จ 2:ย โ ์ผ์ชฝ ์๋จ 2: โ, ์ค๋ฅธ์ชฝ ํ๋จ 2:ย โ ์ผ์ชฝ ์๋จ 2: โ, ์ค๋ฅธ์ชฝ ํ๋จ 2:ย โ
CCTV๋ CCTV๋ฅผ ํต๊ณผํ ์ ์๋ค. ์๋ ์์๋ฅผ ๋ณด์.
0 0 2 0 3 0 6 0 0 0 0 0 6 6 0 0 0 0 0 0
์์ ๊ฐ์ ๊ฒฝ์ฐ์ 2์ ๋ฐฉํฅ์ด โ 3์ ๋ฐฉํฅ์ดย โ์ย โ์ธ ๊ฒฝ์ฐ ๊ฐ์๋ฐ๋ ์์ญ์ ๋ค์๊ณผ ๊ฐ๋ค.
# 2 # 3
0 6 # 0 # 0 0 6 6 # 0 0 0 0 #
์ฌ๋ฌด์ค์ ํฌ๊ธฐ์ ์ํ, ๊ทธ๋ฆฌ๊ณ CCTV์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, CCTV์ ๋ฐฉํฅ์ ์ ์ ํ ์ ํด์, ์ฌ๊ฐ ์ง๋์ ์ต์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฌ๋ฌด์ค์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (1 โค N, M โค 8) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ฌ๋ฌด์ค ๊ฐ ์นธ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ, 6์ ๋ฒฝ, 1~5๋ CCTV๋ฅผ ๋ํ๋ด๊ณ , ๋ฌธ์ ์์ ์ค๋ช ํ CCTV์ ์ข ๋ฅ์ด๋ค.ย CCTV์ ์ต๋ ๊ฐ์๋ 8๊ฐ๋ฅผ ๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฌ๊ฐ ์ง๋์ ์ต์ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
4 6
0 0 0 0 0 0
0 0 0 0 0 0
0 0 1 0 6 0
0 0 0 0 0 0
์ถ๋ ฅ
20
์์ 2
์ ๋ ฅ
6 6
0 0 0 0 0 0
0 2 0 0 0 0
0 0 0 0 6 0
0 6 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 5
์ถ๋ ฅ
15
์์ 3
์ ๋ ฅ
6 6
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
์ถ๋ ฅ
6
์์ 4
์ ๋ ฅ
6 6
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 5 0 0
0 0 5 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
์ถ๋ ฅ
2
์์ 5
์ ๋ ฅ
1 7
0 1 2 3 4 5 6
์ถ๋ ฅ
0
์์ 6
์ ๋ ฅ
3 7
4 0 0 0 0 0 0
0 0 0 2 0 0 0
0 0 0 0 0 0 4
์ถ๋ ฅ
0
My Sol
import sys
input = sys.stdin.readline
def dfs(i, N):
global didj_dict
if i == N:
findStart()
return
ci, cj, ck = CCTVs[i]
for didj_lst in didj_dict[ck]:
cctvSet.append((ci, cj, didj_lst))
dfs(i+1, N)
cctvSet.pop()
def findStart():
global cctvSet, mat, min_ns
global I, J
# mat2 ์ ์
mat2 = []
for lst in mat:
mat2.append(lst[::])
# ๋ชจ๋ CCTV์ ๊ฐ์์ง์ญ ์ฒดํฌ
for cctvInfo in cctvSet:
ci, cj, didj_lst = cctvInfo
for di, dj in didj_lst:
k = 1
while 0<=ci+di*k<I and 0<=cj+dj*k<J:
# ํ์ ์ขํ์ ๊ฐ์ด 0์ด๋ฉด # ๋ฃ๊ธฐ
if not mat2[ci+di*k][cj+dj*k]:
mat2[ci+di*k][cj+dj*k] = '#'
# ํ์ ์ขํ์ ๊ฐ์ด 6์ด๋ฉด ๋ฐ๋ณต ํ์ถ
elif mat2[ci+di*k][cj+dj*k]==6:
break
k += 1
# mat2์ 0 ์ฒดํฌ
sum_v = 0
for i in range(I):
for j in range(J):
if not mat2[i][j]:
sum_v += 1
# sum_v = 0์ด๋ฉด ์ข
๋ฃ
if not sum_v:
print(0)
quit()
# ์ต์๊ฐ ๊ฐฑ์
if min_ns > sum_v:
min_ns = sum_v
# ์
๋ ฅ ์ฒ๋ฆฌ
I, J = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(I)]
didj_dict = {
1: [[(-1,0)],
[(0,-1)],
[(1,0)],
[(0,1)]],
2: [[(-1,0),(1,0)],
[(0,-1),(0,1)]],
3: [[(0,-1),(-1,0)],
[(-1,0),(0,1)],
[(0,1),(1,0)],
[(1,0),(0,-1)]],
4: [[(-1,0),(0,1),(1,0)],
[(0,-1),(0,1),(1,0)],
[(0,-1),(-1,0),(1,0)],
[(0,-1),(-1,0),(0,1)]],
5: [[(0,-1),(-1,0),(0,1),(1,0)]]}
# CCTV ์ขํ, ์ข
๋ฅ ์ ์ฅ
cctvN = 0
CCTVs = []
for i in range(I):
for j in range(J):
if 0 < mat[i][j] < 6:
CCTVs.append((i, j, mat[i][j]))
cctvN += 1
# main ์คํ
cctvSet = []
min_ns = I*J
dfs(0, cctvN)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(min_ns)
๋ชจ๋ ์ํฉ์ ๋ํด์ ์์ ํ์ํด์ผํ๋ ๋ฌธ์ ์๋ค. cctv์ ํ์ ๋ณ ๋ฐ๋ผ๋ณด๋ ๊ฐ๋์ delta ๋จ์๋ฅผ dictionary๋ก ์ง์ ํด ํธ์ถํ ์ ์๋๋ก ํ์๋ค. CCTV์ ์ขํ์ ํจ๊ป ํ์ ๊น์ง ํจ๊ป ์ ์ฅํด dfs๋ก ๋๋ ธ์ผ๋ฉฐ, CCTV์ ํ์ ๋๋ฌธ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์ด ๋์ ๋ณต์กํ ๊ฒ๋ง ์ ์ธํ๊ณ ๋ ํ๋ฆ๋๋ก ๋ฐ๋ผ๊ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ ๋ฌธ์ ์๋ค. CCTV ํ์ ์ ๊ฐ๊ฐ ๊ฒฝ์ฐ์ ์๋ก ํ๊ณ , dfs ํจ์ ๋ด๋ถ์์ for๋ฌธ์ผ๋ก stack์ ๋นผ๊ณ ๋ฃ๋ ๊ณผ์ ์ ์๊ฐํ๋ ๊ฒ์ด ๊ด๊ฑด์ด์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ