πλ¬Έμ νμνκΈ°
w : μ§λμ λλΉ, h : μ§λμ λμ΄ (w, hμ 50λ³΄λ€ μκ±°λ κ°μ μμ μ μ)
w x h μ§λμ κ° μΉΈμ λ (1) λλ λ°λ€(0)μ΄λ€.
ν λ μμ κ°λ‘, μΈλ‘, λκ°μ μΌλ‘ μ°κ²°λμ΄ μλ λ μ κ±Έμ΄κ° μ μλ€κ³ νλ¨νλ€.
μλ‘ κ±Έμ΄κ° μ μλ λ μ μ§ν©μ 'μ¬'μ΄λΌκ³ ν λ, μ£Όμ΄μ§ μ§λμμ μ¬μ κ°μλ₯Ό ꡬνκΈ°
μ£Όμ΄μ§ μ§λλ₯Ό 2μ°¨μ λ°°μ΄λ‘ ννν μ μκ³ , μ΄ λ°°μ΄μ κ° μ’νλ μ μ μ΄κ³ κ° λ μμ κ°λ‘, μΈλ‘, λλ λκ°μ μΌλ‘ μ°κ²°λ λ€λ₯Έ λ κΉμ§μ κ²½λ‘λ₯Ό κ°μ μΌλ‘ λ³Ό μ μλ€.
μκ³ λ¦¬μ¦ μ ν
μ΄ λ¬Έμ μ λ³Έμ§μ κ·Έλνμμμ μ°κ²° μμλ₯Ό μ°Ύλ λ¬Έμ μ΄λ€. μ¦ κ° μ‘μ§λ₯Ό νλμ μ μ μΌλ‘ λ³΄κ³ , κ·Έ μ‘μ§μ μ°κ²°λ λ€λ₯Έ μ‘μ§λ€μ νμνλ©΄μ κ·Έλ£Ήμ μ°ΎμμΌ νλ€. λ°λΌμ κ·Έλν νμ μ€ BFS, DFS μ΄λ κ²μ μ¬μ©ν΄λ ν¬κ² μκ΄ μλ€. μ΄λ²μλ DFSλ‘ κ΅¬νν΄λ³΄κ³ μ νλ€.
DFSμ μκ°λ³΅μ‘λλ O(μ μ κ°μ + κ°μ κ°μ)μ΄λ€. μ μ κ°μλ μ΅λ 50*50=2500, κ°μ κ°μλ 8*2500 = 20000 μ λ μκ°λ³΅μ‘λλ μ΅λ O(2500 + 20000) μ λλ‘, μκ° μμ νμμ΄ κ°λ₯νλ€.
DFSλ‘ ν μ μλ?
- μ£Όμ΄μ§ λ°μ΄ν°λ₯Ό κ·Έλν ννλ‘ ν΄μ κ°λ₯νκ°?
- μ§λμ λ λ€(μ μ ), λ μμ κ±Έμ΄κ° μ μλ λ€λ₯Έ λ μΌλ‘ μ΄λνλ κ²½λ‘(κ°μ )
- νμ κΉμ΄κ° λ무 κΉμ§ μμκ°?
- DFSλ μ¬κ·μ μΌλ‘ κΉμ΄λ₯Ό νμνκΈ° λλ¬Έμ νμ κΉμ΄κ° λ무 κΉμ΄μ§λ©΄ μ¬κ· νΈμΆ νκ³λ₯Ό λμ μ μλ€.
- μ΄ λ¬Έμ λ κ°λ‘, μΈλ‘μ μ΅λκ° 50μΌλ‘ μ νλμ΄ μκΈ° λλ¬Έμ ν¬κ² λ¬Έμ κ° μλ€.
- μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύλ λ¬Έμ κ° μλκ°?
- μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύλ λ¬Έμ λΌλ©΄ DFS μΈμ μκ³ λ¦¬μ¦μ μ ννλ κ²μ΄ μ ν©ν¨
- μ΄ λ¬Έμ λ μ»΄ν¬λνΈλ₯Ό μ°Ύλ λ¬Έμ
πμ½λ μ€κ³νκΈ°
1. κ° ν μ€νΈ μΌμ΄μ€λ§λ€ λλΉ(w), λμ΄(h)λ₯Ό μ λ ₯λ°κ³ , ν΄λΉνλ ν¬κΈ°μ μ΄μ°¨μ λ°°μ΄(map_data)μ μμ±νλ€.
2. μ΄μ°¨μ λ°°μ΄μ μ§λ μ 보λ₯Ό μ μ₯νλ€.
3. μ¬ κ°μ μΉ΄μ΄νΈμ© λ³μ(island_cnt)λ₯Ό λ§λ λ€.
4. μ΄μ°¨μ λ°°μ΄μ κ° μμλ₯Ό νμνλ©΄μ μμ§ λ°©λ¬Ένμ§ μμ λ (1)μ λ°©λ¬Ένλ©΄, μ¬ κ°μ μΉ΄μ΄νΈ λ³μμ 1μ λνκ³ map_dataμ ν΄λΉ μΉΈμ 0μΌλ‘ 체ν¬ν λ€, dfs νμμ μμνλ€.
5. ν΄λΉ μ μ μμ μ, ν, μ’, μ°, λκ°μ λ°©ν₯μΌλ‘ μ΄λνλ©΄μ μμ§ λ°©λ¬Ένμ§ μμ λ (1)μ΄λ©΄, λ°©λ¬Έ μ²΄ν¬ ν μ¬κ·μ μΌλ‘ dfsν¨μλ₯Ό νΈμΆνλ€.
6. μ΄μ°¨μ λ°°μ΄μ λͺ¨λ μμμ νμμ΄ λλλ©΄, μ¬ κ°μλ₯Ό μΆλ ₯νλ€.
π μλ νμ°¨ μμ μ¬ν
1νμ°¨
- λ°νμ μλ¬ (RecursionError) λ°μ, μ¬κ· κΉμ΄ μ νμ λλ €μ£Όλ κ²μ κΉλΉ‘νλ€..:)
- sys.setrecursionlimit()λ‘ μ¬κ· κΉμ΄ μ νμ λλ €μ€λ€.
- μ΄λ¬ν λ¬Έμ λ₯Ό λ°©μ§νκΈ° μν΄ μ€ν κΈ°λ°μΌλ‘ DFSλ₯Ό ꡬννλ κ²λ κ³ λ €ν μ μλ€.
π μ λ΅ μ½λ
import sys
sys.setrecursionlimit(10 ** 5)
delta = [(0,1),(0,-1),(1,0),(-1,0),(1,1),(1,-1),(-1,1),(-1,-1)]
def dfs(x, y):
for dx, dy in delta:
nx, ny = x+dx, y+dy
if 0 <= nx < h and 0 <= ny < w and map_data[nx][ny]:
map_data[nx][ny] = 0
dfs(nx, ny)
while True:
w, h = map(int, input().split())
if w == 0 and h == 0:
break
map_data = [list(map(int, input().split())) for _ in range(h)]
island_cnt = 0
for i in range(h):
for j in range(w):
if map_data[i][j]:
island_cnt += 1
map_data[i][j] = 0
dfs(i, j)
print(island_cnt)