๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ

[DFS] ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

by ๋ญ…์ฆค 2021. 5. 17.
๋ฐ˜์‘ํ˜•

- ๋ฌธ์ œ

NxM ํฌ๊ธฐ์˜ ์–ผ์Œ ํ‹€์ด ์žˆ๊ณ  ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„์„ 0, ์นธ๋ง‰์ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„์„ 1๋กœ ํ‘œ์‹œ๋œ๋‹ค. ๊ตฌ๋ฉ์ด ๋šซ๋ ค ์žˆ๋Š” ๋ถ€๋ถ„๋ผ๋ฆฌ ์ƒํ•˜์ขŒ์šฐ๋กœ ๋ถ™์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ์ด ๋•Œ ์–ผ์Œ ํ‹€์˜ ๋ชจ์–‘์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์ด ์•„์ด์Šคํฌ๋ฆผ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ex)

00110

00011

11111

00000  

-> ์•„์ด์Šคํฌ๋ฆผ 3๊ฐœ ์ƒ์„ฑ

 

- ํ•ด์„ค

DFS ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

1. ํŠน์ •ํ•œ ์ง€์ ์˜ ์ฃผ๋ณ€ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด๋ณธ ๋’ค์— ์ฃผ๋ณ€ ์ง€์  ์ค‘์—์„œ ๊ฐ’์ด 0 ์ด๋ฉด์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ง€์ ์„ ๋ฐฉ๋ฌธ

2. ๋ฐฉ๋ฌธํ•œ ์ง€์ ์—์„œ ๋‹ค์‹œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ฐฉ๋ฌธ์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•˜๋ฉด ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ง€์ ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.

3. 1~2๋ฒˆ์˜ ๊ณผ์ •์„ ๋ชจ๋“  ๋…ธ๋“œ์— ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ง€์ ์˜ ์ˆ˜๋ฅผ ์„ผ๋‹ค.

 

n,m = map(int,input().split())

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋งต ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
graph =[]
for i in range(n):
    graph.append(list(map(int,input())))

def dfs(x,y):
    if x<=-1 or x>=n or y<=1 or y>=m:   # ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์ข…๋ฃŒ
        return False

    if graph[x][y]==0:                  # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
        graph[x][y]=1                   # ํ•ด๋‹น ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        # ์ƒํ•˜์ขŒ์šฐ ์œ„์น˜ ๋ชจ๋‘ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
        dfs(x-1,y)                     
        dfs(x+1,y)
        dfs(x,y-1) 
        dfs(x,y+1)
        # ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๋ฉด False ๋œฐ๊ฑฐ๊ณ  ์ƒํ•˜์ขŒ์šฐ ์—ฐ๊ฒฐ๋œ ๊ณณ๊นŒ์ง€ ๋‹ค๋ณด๊ณ  ๋‚˜๋ฉด True ์ถœ๋ ฅ
        # ์—ฐ๊ฒฐ๋œ ์ขŒํ‘œ๋Š” ์ „๋ถ€ 1๋กœ ๋ฐ”๋€œ 
        return True
    return False


result = 0
for i in range(n):
    for j in range(m):
        if dfs(i,j)==True:
            result+=1

print(result)


 

 

๋ฐ˜์‘ํ˜•