DFS๋ฌธ์ œ (์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ) - ์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค

2020. 8. 25. 18:28ใ†์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค/DFS,BFS

DFS๋ฌธ์ œ (์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ) - ์ด๊ฒƒ์ด ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค

 

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

 

0 0 1 1 0
0 0 0 1 1
1 1 1 1 1
0 0 0 0 0

์ž…๋ ฅ ์กฐ๊ฑด: 

  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ์–ผ์Œ ํ‹€์˜ ์„ธ๋กœ ๊ธธ์ด N๊ณผ ๊ฐ€๋กœ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค.(1 <=N, M <=1,000)
  • ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์–ผ์Œ ํ‹€์˜ ํ˜•ํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ์ด๋•Œ ๊ตฌ๋ฉ์ด ๋šซ๋ ค์žˆ๋Š” ๋ถ€๋ถ„์€ 0, ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„์€ 1์ด๋‹ค.

 

๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ํ‚ค์›Œ๋“œ๋Š” DFS์ด๋‹ค. 0๋ผ๋ฆฌ๋Š” ์ด์–ด์ ธ์žˆ์œผ๋ฏ€๋กœ ์ด์–ด์ ธ์žˆ์ง€ ์•Š๋Š” ๊ณณ๊นŒ์ง€ ํƒ์ƒ‰์„ ํ•œ ๋’ค, count๋ฅผ ์˜ฌ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

 

๋ฌธ์ œ๋Š” ๊ตฌํ˜„๋ฐฉ๋ฒ•์ด๋‹ค. ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผํ• ๊นŒ?

1. visited๋ผ๋Š” True or False๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตณ์ด ์•ˆ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ์ˆซ์ž๊ฐ€ 1์ผ ๊ฒฝ์šฐ False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

2. dfs์˜ ํ•จ์ˆ˜์ธ์ž์— x์™€ y๋ฅผ N x M ๋งŒํผ ์ฃผ๋ฉด์„œ graph[x][y]๊ฐ€ True๊ฐ€ ๋  ์‹œ์— count๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ฆด ๊ฒƒ์ด๋‹ค. graph[x][y]๊ฐ€ True๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ dfsํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณณ์„ ๋‹ค ๋‹ค๋…”์„ ๋•Œ True๊ฐ€ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

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

graph = []
for i in range(n):
  graph.append(list(map(int,input())))

def dfs(x,y):
  if x <= -1 or y <= -1 or x >=n 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)
    return True
  return False
  
count =0
for i in range(n):
  for j in range(m):
    if dfs(i,j) == True:
      count += 1
      
print(count)
 

map(int, input().split())    --> ๊ณต๋ฐฑ์„ ํ†ตํ•ด ์ž…๋ ฅ์„ ๋ฐ›์€ ๋’ค int๋กœ

 

list(map(int,input()))  --> list๋ฅผ ๋ฐ›๋Š”๋ฐ ์ž…๋ ฅ์„ ๋ฐ›์€ ๋’ค int๋กœ

 

์ € ์œ„์— dfs(x-1,y) , dfs(x+1,y), dfs(x,y-1), dfs(x,y+1)์„ for k in range(4)๋กœ ํ•ด์„œ nx = x + dx[i], ny = y+ dy[i]๋ฅผ ํ•ด๋ณด์•˜๋”๋‹ˆ ๋˜์ง€ ์•Š์•˜๋‹ค. ์กฐ๊ฑด์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š”๊ฑธ๊นŒ? ํ์—์„œ๋Š” ์ €๋Ÿฌํ•œ ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์•ˆ์“ฐ๋Š” ์ด์œ ๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.