[BOJ][๐ก5][๋ฐฑ์ค#01245] ๋์ฅ ๊ด๋ฆฌ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋๋ถ ๋ฏผ์์ด๊ฐ ๊ด๋ฆฌํ๋ ๋์ฅ์ NรM ๊ฒฉ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ฏผ์์ด๋ ๋์ฅ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฐ๋ด์ฐ๋ฆฌ๋ง๋ค ๊ฒฝ๋น์๋ฅผ ๋ฐฐ์นํ๋ ค ํ๋ค. ์ด๋ฅผ ์ํด ๋์ฅ์ ์ฐ๋ด์ฐ๋ฆฌ๊ฐ ์ด ๋ช ๊ฐ ์๋์ง๋ฅผ ์ธ๋ ๊ฒ์ด ๋ฌธ์ ๋ค. ์ฐ๋ด์ฐ๋ฆฌ์ ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค. ์ฐ๋ด์ฐ๋ฆฌ๋ ๊ฐ์ ๋์ด๋ฅผ ๊ฐ์ง๋ ํ๋์ ๊ฒฉ์ ํน์ ์ธ์ ํ ๊ฒฉ์๋ค์ ์งํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. (์ฌ๊ธฐ์ โ์ธ์ ํ๋คโ์ ์ ์๋ X์ขํ ์ฐจ์ด์ Y์ขํ ์ฐจ์ด ๋ชจ๋ 1 ์ดํ์ผ ๊ฒฝ์ฐ๋ก ์ ์๋๋ค.) ๋ํ ์ฐ๋ด์ฐ๋ฆฌ์ ์ธ์ ํ ๊ฒฉ์๋ ๋ชจ๋ ์ฐ๋ด์ฐ๋ฆฌ์ ๋์ด๋ณด๋ค ์์์ผํ๋ค. ๋ฌธ์ ๋ ๊ฒฉ์ ๋ด์ ์ฐ๋ด์ฐ๋ฆฌ์ ๊ฐ์๊ฐ ์ด ๋ช ๊ฐ์ธ์ง ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ N(1 < N โค 100), M(1 < M โค 70)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N+1๋ฒ์งธ ์ค๊น์ง ๊ฐ ์ค๋ง๋ค ๊ฒฉ์์ ๋์ด๋ฅผ ์๋ฏธํ๋ M๊ฐ์ ์ ์๊ฐ ์ ๋ ฅ๋๋ค. ๊ฒฉ์์ ๋์ด๋ 500๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ด ์๋ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ฐ๋ด์ฐ๋ฆฌ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
8 7
4 3 2 2 1 0 1
3 3 3 2 1 0 1
2 2 2 2 1 0 0
2 1 1 1 1 0 0
1 1 0 0 0 1 0
0 0 0 1 1 1 0
0 1 2 2 1 1 0
0 1 1 1 2 1 0
์ถ๋ ฅ
3
My Sol
import sys
input = sys.stdin.readline
def main():
def find_heights():
H = [set() for _ in range(501)]
for i in range(I):
for j in range(J):
H[mat[i][j]].add((i, j))
return H
def check_around(i, j, h):
if not (i, j) in H[mat[i][j]]: return
H[mat[i][j]].remove((i, j))
for di in range(-1, 2):
si = i+di
if not 0<=si<I: continue
for dj in range(-1, 2):
sj = j+dj
if not 0<=sj<J: continue
if mat[si][sj] > h: continue
check_around(si, sj, mat[si][sj])
return
I, J = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(I)]
H = find_heights()
cnt = 0
while H:
if not H[-1]:
H.pop()
continue
while H[-1]:
i, j = H[-1].pop()
H[-1].add((i, j))
check_around(i, j, mat[i][j])
cnt += 1
return cnt
print(main())
๊ทธ๋ํ์ DFS๋ฅผ ํ์ฉํ๋ ๋ฌธ์ ์๋ค. ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
- ๊ฐ๋ก, ์ธ๋ก, ๋์ด ์ ๋ณด์ ์ ๋ ฅ์ ๋ฐ๋๋ค.
- ์ต๋ ๋์ด๋ 500์ด๋ฏ๋ก, ๊ธธ์ด๊ฐ 501์ธ list์ set์ ๊ฐ๊ฐ ๋ฃ์ด์ค๋ค.
- ๋์ด ์ ๋ณด
mat
์ ์ขํ๋ณ๋ก ๋์ด๋ฅผ ๊ณ์ฐํดH
์ ๋ฃ์ด์ค๋ค. - ๋์ ๋ด์ฐ๋ฆฌ๋ถํฐ
check_around
ํจ์๋ฅผ ํตํด์ ์ฃผ๋ณ์ ์ขํ๋ฅผ ํ์ธํ๋ค. ๋์์ง๊ธฐ ์ ๊น์ง ๊ณ์ ๋ฐ๋ณตํ๋ฉด ์ฃผ๋ณ์ ์ดํ๋ค. - ์ด ๊ณผ์ ์์ ๋ฐฉ๋ฌธํ ์ขํ๋
H
์์ ์ ๊ฑฐํ๋ค. ์ดํ์ ๋ด์ฐ๋ฆฌ๋ก ์ธ์ํ์ง ์๊ธฐ ์ํจ์ด๋ค. check_around
๋ฅผ ํ ๋ฒ ์คํํ๋ค๋ฉด ํ์ฌ๊น์ง ์ค์ ๋ด์ฐ๋ฆฌ๋ก ์น ์ ์๋ ๋ด์ฐ๋ฆฌ๋ก๋ถํฐ ์ฃผ๋ณ์ ์ ๊ฑฐํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์cnt
๋ฅผ 1 ์ฌ๋ ค์ค๋ค.- ๋ชจ๋
mat
์ ์ขํ์ ๋ํด ์ด ๊ณผ์ ์ ์ค์ํ ๋คcnt
๋ฅผ ๋ฐํํ์ฌ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ