๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/DFS,BFS

[์ด์ฝ”ํ…Œ] ์Œ๋ฃŒ์ˆ˜ ์–ผ๋ ค ๋จน๊ธฐ

by syLim___ 2023. 2. 23.
728x90

์ถœ์ฒ˜: ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ(๋‚˜๋™๋นˆ)

https://www.youtube.com/watch?v=7C9RgOcvkvo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3

 

๋ฌธ์ œ

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

 

๋ฌธ์ œ ์กฐ๊ฑด

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

์ž‘์„ฑ ์ฝ”๋“œ

์›๋ž˜ bfs๋ณด๋‹ค dfs๋ฅผ ์„ ํ˜ธํ•˜๋Š” ํŽธ์ธ๋ฐ ๊ฐ‘์ž๊ธฐ bfs๋กœ ํ’€๊ณ ์‹ถ์–ด์„œ bfs ๊ตฌํ˜„ํ•˜๋ ค๋‹ค๊ฐ€ ์ข€ ์• ๋จน์—ˆ๋”ฐ...

ํŒŒ์ด์ฌ์€ ๊ฑฐ์˜ ์ดˆ๋ณด์ด๋‹ค๋ณด๋‹ˆ๊นŒ ์ด์ฐจ์› ๋ฐฐ์—ด์„ ์ž˜ ๋‹ค๋ฃฐ ์ค„ ๋ชฐ๋ผ์„œ ํŠนํžˆ ํž˜๋“ค์—ˆ๋‹ค

from collections import deque

#์ƒ,ํ•˜,์ขŒ,์šฐ
dx = [-1,1,0,0]
dy = [0,0,-1,1]


def bfs(x,y,graph,visited):
  visited[x][y]=True
  q = deque()
  q.append((x,y))

  while q:
    a,b = q.popleft()
    for i in range(4):
      nx = a + dx[i]
      ny = b + dy[i]
      if 1<=nx<=n and 1<=ny<=m and not visited[nx][ny]:
        visited[nx][ny] = True
        if graph[nx][ny]==0:
          q.append((nx,ny))

  return


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

graph = [[0 for j in range(m+1)] for i in range(n+1)]
visited = [[False for j in range(m+1)] for i in range(n+1)]

#graph์— ๊ฐ’ ์ €์žฅ
for i in range(n):
  temp = input()
  for j in range(m):
    graph[i+1][j+1] = int(temp[j])
    

#bfs๋Œ๋ฆฌ๊ธฐ
cnt = 0
for i in range(1,n+1):
  for j in range(1,m+1):
    if not visited[i][j] and graph[i][j]==0:
      cnt+=1
      bfs(i,j,graph,visited)
      


print(cnt)

 

 

์˜ˆ์‹œ ๋‹ต์•ˆ ๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์˜ˆ์‹œ์—์„œ๋Š” dfs๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๊ธธ๋ž˜

๊ฐ‘์ž๊ธฐ dfs๋กœ๋„ ํ˜ผ์ž ๋จผ์ € ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ๊ฐ•์˜ ๋ฉˆ์ถฐ๋†“๊ณ  dfs๋กœ ๋‹ค์‹œ ํ’€์–ด๋ดค๋‹ค

def dfs(x,y,graph,visited):
  visited[x][y] = True

  for i in range(4):
    nx = x + dx[i]
    ny = y + dy[i]
    if 1<=nx<=n and 1<=ny<=m and not visited[nx][ny]:
      visited[nx][ny]=True
      if graph[nx][ny] == 0:
        dfs(nx,ny,graph,visited)

  return

 

๊ฐ•์˜ ์˜ˆ์‹œ ์ฝ”๋“œ

์ผ๋‹จ ๋ณด์ž๋งˆ์ž ๋‚˜๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ์—„์ฒญ ๊ฐ„๊ฒฐํ•œ ๊ฒŒ ๋А๊ปด์กŒ๋‹ค

 

์šฐ์„  ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ถ€๋ถ„

# n * m ๋ฐฐ์—ด ์š”์†Œ ์ž…๋ ฅ๋ฐ›๊ธฐ

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

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

 -๋‚˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ (n+1)*(m+1) ํฌ๊ธฐ์˜ ์ด์ฐจ์› ๋ฐฐ์—ด์„ ๋จผ์ € ๋งŒ๋“ค์–ด๋†“๊ณ  ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์œผ๋ฉฐ ํ•˜๋‚˜ํ•˜๋‚˜ updateํ•ด์ฃผ์—ˆ๋Š”๋ฐ,

 -์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ๋Š” graph ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธ๋งŒ ํ•ด๋†“๊ณ  ๋ฐ”๋กœ ์ž…๋ ฅ๋ฐ›์•˜์Œ

 

๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ฒดํฌ

 -๋‚˜๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ์ƒˆ๋กœ์šด ์ด์ฐจ์›๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๊ฑฐ๊ธฐ์— ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด๊ฐ€๋ฉด์„œ ์ˆ˜ํ–‰ํ–ˆ์Œ

 -์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ , ๋ฐฉ๋ฌธ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์‹œ ๊ฐ’์„ 1๋กœ ๋ฐ”๊พธ์–ด์คŒ์œผ๋กœ์จ ๋ฐฉ๋ฌธ๋…ธ๋“œ๋ฅผ ์ฒดํฌํ•˜์˜€๊ณ , ๋ฆฌํ„ด๊ฐ’์ด True๊ฐ€ ๋˜์–ด ์ตœ์ดˆ๋กœ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๊ฐ€ ๋œ ๊ฒฝ์šฐ์—๋Š” ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ์—ˆ๋‹ค.

 

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ฒดํฌ ๋ฐฐ์—ด์„ ๋”ฐ๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์‹œ ๋‹ต์•ˆ๊ณผ ๋น„๊ตํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๋งŽ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค

728x90