[BOJ][๐ก3][๋ฐฑ์ค#01888] ๊ณฐํก์ด
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋ฒฝ์ ๊ณฐํก์ด๊ฐ ์๋ผ๊ณ ์๋ค. ๊ณฐํก์ด๋ค์ ํ์ฌ ์ฌ๋ฌ ๊ฐ์ ๋ฉ์ด๋ฆฌ๋ฅผ ์ด๋ฃจ๊ณ ์๋ ์ํ์ธ๋ฐ, ์ด๋ค์ด ์ ์ ์๋ผ๋์ ํ ๋ฉ์ด๋ฆฌ๋ก ๋ ๋๊น์ง ์ผ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆด์ง ์๊ณ ์ถ๋ค. ์ด๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์. ๊ณฐํก์ด๊ฐ ํผ์ด ์๋ ๋ฒฝ์ mํ n์ด์ ๊ฒฉ์๋ก ๋๋์ด ์๊ณ , ํ ์นธ ๋น ํ ๊ฐ์ ๊ณฐํก์ด๊ฐ ์๋ค. ๊ณฐํก์ด์ ๋ฉ์ด๋ฆฌ๋ผ๋ ๊ฒ์, ๊ฒฉ์ ์์ ๊ฐ๋ก์ธ๋ก๋ก ์ธ์ ํ ๊ณฐํก์ด๋ค์ ์งํฉ์ ๋งํ๋ค. ๋งจ ์ฒ์ ์ํ์์๋ ํ ๋ฉ์ด๋ฆฌ ์์ ๊ณฐํก์ด๋ค์ด ๋ชจ๋ ๊ฐ์ ์ข ์ผ๋ก, ์๋ผ๋ ์๋๋ ๊ฐ๋ค. ๊ทธ๋ฌ๋ ์๋ก ๋ค๋ฅธ ๋ฉ์ด๋ฆฌ์ ์ํ ๊ณฐํก์ด๋ ์ข ์ด ๋ฌ๋ผ ์๋ผ๋ ์๋๋ ๋ค๋ฅผ ์ ์๋ค. ๋, ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์ข ์ ๊ณฐํก์ด ๋ฉ์ด๋ฆฌ๊ฐ ํ ๋ฉ์ด๋ฆฌ๋ก ํฉ์ณ์ง๋ ๊ฒฝ์ฐ๋ ์์ ์ ์๋ค. ๋ง์ฝ ์ด๋ ๊ณฐํก์ด์ ์๋ผ๋ ์๋๊ฐ k๋ผ๋ฉด, ํ๋ฃจ๊ฐ ์ง๋ฌ์ ๋ ๊ทธ ๊ณฐํก์ด๊ฐ ํผ์ด์๋ ์๋ฆฌ๋ฅผ ์ค์ฌ์ผ๋ก 2k+1ํ 2k+1์ด์ ๊ฒฉ์์ ๊ฐ์ ์ข ์ ๊ณฐํก์ด๊ฐ ๋ฒ์ง๋ค๋ ์๋ฏธ์ด๋ค. ๋ง์ฝ ์๋ก ๋ค๋ฅธ ์ข ์ ๊ณฐํก์ด๊ฐ ๊ฐ์ ์นธ์ ๋ฒ์ ธ ์ค๋ฉด, ์๋ผ๋ ์๋๊ฐ ๋น ๋ฅธ ๊ณฐํก์ด๊ฐ ๊ทธ ์นธ์ ์ฐจ์งํ๋ค.
์ ๋ ฅ
์ฒซ ์ค์ ๊ณฐํก์ด๊ฐ ํผ์ด ์๋ ๋ฒฝ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ m๊ณผ n์ด ์ฃผ์ด์ง๋ค. (1 โค m, n โค100) ๋์งธ ์ค๋ถํฐ๋ ๋ฒฝ์ ์ํฉ์ด ํ ์ค์ ํ ํ์ฉ ์ฃผ์ด์ง๋ค. ๊ณฐํก์ด๊ฐ ํผ์ด์๋ ๊ณณ์ ๊ทธ ๊ณฐํก์ด์ ์๋ผ๋ ์๋๋ก, ๊ทธ๋ ์ง ์์ ๊ณณ์ 0์ผ๋ก ํ์๋์ด ์๋ค. ์๋ผ๋ ์๋๋ 1์ด์ 5์ดํ์ ์ ์์ด๋ค. ๊ฐ ์ซ์ ์ฌ์ด์๋ ๋น ์นธ์ด ์๋ค.
์ถ๋ ฅ
์ฒซ ์ค์ ๊ณฐํก์ด๊ฐ ํ ๋ฉ์ด๋ฆฌ๊ฐ ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํ๋ฃจ ๋จ์๋ก ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
5 15
002000000000011
022000000011111
020000000010000
000000011110111
000000011110111
์ถ๋ ฅ
2
My Sol
def main():
def find_positions():
positions = dict()
for n in range(6):
positions[n] = set()
for i in range(I):
for j in range(J):
positions[mat[i][j]].add((i, j))
positions.pop(0)
nums = []
for n in range(5, 0, -1):
if positions[n]:
nums.append(n)
else:
positions.pop(n)
return nums, positions
def get_all_values_set():
all_values_set = set()
for s in positions.values():
all_values_set |= s
return all_values_set
def check_is_one():
# ๊ฐ์ด ์๋ ํ ์ ์ฐพ๊ธฐ
all_values_set = get_all_values_set()
fi, fj = all_values_set.pop()
all_values_set.add((fi, fj))
# ํด๋น ์ขํ๋ก๋ถํฐ BFS
visit = set()
Q = {(fi, fj)}
while Q:
ni, nj = Q.pop()
if (ni, nj) in visit: continue
visit.add((ni, nj))
for di, dj in ((-1,0),(1,0),(0,-1),(0,1)):
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
if not mat[si][sj]: continue
if (si, sj) in visit: continue
Q.add((si, sj))
# visit๊ณผ all_values_set์ด ๊ฐ์ผ๋ฉด one group
other_group = all_values_set-visit
return False if other_group else True
def expand():
for n in nums:
expand_set = set()
for ni, nj in positions[n]:
for di in range(-n, n+1):
si = ni+di
for dj in range(-n, n+1):
sj = nj+dj
if not (0<=si<I and 0<=sj<J): continue
if mat[si][sj] >= n: continue
expand_set.add((si, sj))
for ei, ej in expand_set:
mat[ei][ej] = n
for m in nums:
if m==n:
positions[m] |= expand_set
else:
positions[m] -= expand_set
I, J = map(int, input().split())
mat = [list(map(int, input())) for _ in range(I)]
nums, positions = find_positions()
day = 0
while True:
if check_is_one(): return day
expand()
day += 1
print(main())
์ฌ๋ฌ๋ชจ๋ก ์ต์ ํ๋ฅผ ์ํด ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ ๋ฌธ์ ์๋ค. BFS๋ฅผ ํ์ฉํ๋ ๋ฌธ์ ์๋ค. ๋ชจ๋ ์ฝ๋๋ main
ํจ์ ๋ด๋ถ์์ ์ฒ๋ฆฌ๋๋ค.
- ๊ฐ๋ก ์ธ๋ก ๊ณฐํก์ด 2์ฐจ์์ ์ ๋ ฅ์ผ๋ก ๋ฐ์์ค๋ค.
- ๊ณฐํก์ด 2์ฐจ์ ๋ฐฐ์ด
mat
์ ๊ฐ ์ขํ๋ค์ ๋ชจ๋ ์ํํ๋ฉฐ ๊ณฐํก์ด ์ข ๋ฅ์ ์ขํ๋ฅผ ํ์ธํ๋ค. ๊ณฐํก์ด ์ขํ๋ฅผ ๋ชจ๋ ์ ์ฅํ ๋ค, ๊ฐ์ด 0์ด๊ฑฐ๋ ์ขํ๊ฐ ์๋ ๊ฐ๋ค์ dictionary์์ ์ ๊ฑฐํด์ค๋ค. ์ด ๊ณฐํก์ด ์ข ๋ฅ(ํ์ฅ์๋)๋ฅผ ๋ชจ์๋ ๋ฆฌ์คํธ๋nums
, ๊ฐ ์ข ๋ฅ๋ฅผ key๋ก ํ๊ณ ์ขํ๋ค์ set์ผ๋ก ์ ์ฅํ๋positions
๋ก ๋์๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์๋find__positions
ํจ์์ด๋ค. - ํ์ฅ์ด ์์ด๋ ํ๋์ ๊ทธ๋ฃน์ผ ์ ์๊ธฐ ๋๋ฌธ์ 0์ผ๋ถํฐ ์์ํ์ฌ ํ ๋ฉ์ด๋ฆฌ์ธ์ง ์ฒดํฌํ๋ค. ์ด๋ฅผ
check_is_one
ํจ์๋ผ๋ ์ด๋ฆ์ผ๋ก ํ์ธํ๋ค. mat
์ ๋ชจ๋ ์ํํ์ง ์๊ณ , ๋ณด๋ค ๋๋ํ ๋ฐฉ๋ฒ์ ์ฐ๊ธฐ๋ก ํ๋ค. ์ฐ์ positions์ ๋ชจ๋ ์ขํ๋ค์ ๋ชจ์๋ set์all_values_set
์ผ๋ก ๋์๋ค. ์ด๋ set์ ํฉ์งํฉ ์ฐ์ฐ์ผ๋ก ์ฝ๊ณ ๋น ๋ฅด๊ฒ ํ ์ ์๋ค. ์ดํ ์ด set์์ ํ ์ขํ๋ฅผ ๊บผ๋ด ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ฐ์ด ์๋ ์ขํ๋ค์ ๋ํด visit์ ์ฒดํฌํ๋ค.- ์ด๋ ๊ฒ ํ ๋ฉ์ด๋ฆฌ์ ๋ํด ์ฒดํฌํ๋ฉด
visit
set์๋ ํ ์ขํ์์ ์์ํ ํ ๋ฉ์ด๋ฆฌ์ ๋ชจ๋ ์ขํ๋ค์ด ์ ์ฅ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ ์ฒดmat
์ ๋ชจ๋ ๊ฐ๋ค์ ๋ชจ์all_values_set
๊ณผ์ ์ฐจ์งํฉ์ ๊ตฌํ๋ค. ๋ง์ฝmat
๋ด์ ๊ณฐํก์ด๊ฐ ํ ๋ฉ์ด๋ฆฌ๋ผ๋ฉดvisit
set์๋ ๋ชจ๋ ๊ณฐํก์ด์ ์ขํ๊ฐ ์์ ๊ฒ์ด๊ณ , ์ด๋ฏธ ๋ชจ๋ ๊ณฐํก์ด์ ์ขํ set์ธall_values_set
์์ ์ฐจ์งํฉ์ ๋น set์ด ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํตํด ํ ๋ฉ์ด๋ฆฌ์์ ํ์ธํ๋ค. - ๋ง์ฝ
check_is_one
์ด True๋ผ๋ฉด day๋ฅผ ๋ฐ๋ก ๋ฐํํ์ฌ ์ถ๋ ฅํ๋ฉด ๋๊ณ , ์๋๋ผ๋ฉด ๊ณฐํก์ด์ ํ์ฅ์ด ์์๋๋ค. ์ด๋ฅผexpand
ํจ์๋ก ๊ตฌํํ๋ค. - ๊ฐ์ด ํฐ ๊ณฐํก์ด ์ข
๋ฅ๋ถํฐ ํ์ฅ์ ์์ํ๋๋ฐ,
nums
์ ๊ณฐํก์ด ์ข ๋ฅ๋ฅผ ์ง์ ํ ๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ํ์ธํ๋ฉฐ ๊ฐ์ ์ถ๊ฐํ์ผ๋ฏ๋ก ํด๋นํ๋ ๊ฐ๋ถํฐ ์์ํ๋ค. - ํด๋น ๊ณฐํก์ด ์ข
๋ฅ์ ๋ชจ๋ ์ขํ๋ค์ ํ์ฅ ๋ฒ์๋ฅผ di, dj๋ฅผ ๊ตฌํด์ ํ์ฅํ๋ ค๋
expand_set
์ ์ถ๊ฐํ๋ค. ์ด๋ ํ ๊ณฐํก์ด ์ข ๋ฅ๋ฅผ ์์ํ ๋ ์ด๊ธฐํํ์ฌ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๊ณ , ๊ฐ์ด ์๊ฑฐ๋ ์๊ธฐ ์ข ๋ฅ๋ณด๋ค ์์ ๊ฐ์ด ์๋ ์ขํ๋ฅผexpand_set
์ ์ถ๊ฐํ๋ค. - ์ดํ
expand_set
์ ๊ฐ ์ขํ๋ฅผ ๋ชจ๋mat
์ ํ์ํ๋ค. ๊ฒฐ๊ตญ ํด๋นํ๋ ์ขํ๋ก ํด๋น ์ข ๋ฅ์ ๊ณฐํก์ด๊ฐ ํ์ฅํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. positions
์์ ํ์ฌ ํ์ฅํ๋ ค๋ ๊ณฐํก์ด ์ข ๋ฅ์ set์๋expand_set
์ ํฉ์งํฉ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ณ , ๊ทธ ์ธ์ ๊ณฐํก์ด์ ๋ํด์๋expand_set
๋ฅผ ๋นผ์ ์ฐจ์งํฉ์ผ๋ก ๋ง๋ค์ด์ค๋ค.- ์ด๋ฅผ ๋ชจ๋ ๊ณฐํก์ด ์ข ๋ฅ์ ๋ํด ๋ฐ๋ณตํ๋ค.
- ํ์ฅ์ ๋ง์ณค๋ค๋ฉด ๋ค์ ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ํ ๊ทธ๋ฃน์์ ํ์ธํ๋ฉด ๋ฐ๋ณต์ ๋ง์น๊ณ
day
๋ฅผ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ