์ฝ”ํ…Œ์ค€๋น„

<dfs bfs> ๋ฐฑ์ค€ 4963๋ฒˆ. ์„ฌ์˜ ๊ฐœ์ˆ˜ (์˜ค๋‹ต๋…ธํŠธ) / ์‹œ๊ฐ„์ดˆ๊ณผ(BFS,DFS)->ํ•ด๊ฒฐ

์š”๋Œœ๋‹ค 2022. 7. 31. 17:40

https://www.acmicpc.net/problem/4963

 

4963๋ฒˆ: ์„ฌ์˜ ๊ฐœ์ˆ˜

์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ๋„ˆ๋น„ w์™€ ๋†’์ด h๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. w์™€ h๋Š” 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ h๊ฐœ ์ค„์—๋Š” ์ง€๋„

www.acmicpc.net

 

๋„ˆ์–ด๋ฌด ์–ด๋ ค์› ๋‹น..

ํ˜ผ์ž ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ด ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด ์ดํ•ดํ•˜์˜€๋‹ค. ์ดํ•ดํ•˜๊ณ  ๋‚˜์„œ ์ƒˆ๋กœ ์งœ๋ดค๋‹ค! 

์ด๊ฑธ ์ƒ๊ฐํ•ด๋‚ธ ์—ฌ๋Ÿฌ๋ถ„ ์ฒœ์žฌ์‹ ๊ฐ€์š”?

#<์™„์„ฑ์ฝ”๋“œ x>
def dfs(x,y):
  global cnt
  graph[x][y] = 0
  for i in range(8):
    nx = x + dx[i]
    ny = y + dy[i]
    if 0<=nx<h and 0<=ny<w:
      if graph[nx][ny]: #๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ฆ‰, ๋•…์ด๋ฉด
        dfs(nx,ny)
        
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1]
w, h = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(h)]
cnt = 0

for i in range(h):
  for j in range(w):
    if graph[i][j]: #1์ด๋ฉด
      cnt += 1
      dfs(i,j)
    
print(*graph, sep = "\n")
print(cnt)

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์šฐ์„ , while๋ฌธ์— ๋„ฃ๊ธฐ ์ „์— ํ•˜๋‚˜์˜ ์ผ€์ด์Šค๋งŒ ์„ฑ๊ณตํ•ด๋ณด์ž ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค. ์ฆ‰, ์•„์ง ์™„์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค!

dfs ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๊ฑด ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•˜๋Š”๋ฐ, 1์ด ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ์—๋งŒ ์–ด๋–ป๊ฒŒ cnt๋ฅผ ๋Š˜๋ฆฌ๋Š”์ง€ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์—ˆ๋‹ค. 

๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์ฒซ ์š”์†Œ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์š”์†Œ๊นŒ์ง€ dfs๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

dfs๊ฐ€ ์‹คํ–‰๋˜๋ฉด, ๊ทธ ์œ„์น˜๋ฅผ 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฑธ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.. ์ด๋Ÿผ visited ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตณ์ด ์ ์„ ํ•„์š”์—†๊ฒ ๊ตฐ..๋Œ€๋ฐ•๐Ÿ™„

์™œ 0์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š”์ง€๋Š” ๋‹ค๋“ค ์•Œ ๊ฒƒ์ด๋‹ค! ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด 0_<-๐Ÿค

๊ฒฐ๊ณผ๋Š” ์œ„์™€ ๊ฐ™์€๋ฐ, graph ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋Œ๋ฉด์„œ 0์œผ๋กœ ๋ฐ”๊ฟ”์คฌ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋ ‡๊ฒŒ ์ถœ๋ ฅ๋˜๊ณ , cnt๋„ ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

 

์ด์ œ bfs๋กœ๋„ ๊ตฌํ˜„ํ•ด๋ณด์ž!

#<์™„์„ฑ ์ฝ”๋“œ x>

def bfs(x,y):
  q = deque()
  q.append( (x,y) )
  while q:
    x,y = q.popleft()
    graph[x][y]=0
    for i in range(8):
      nx = x + dx[i]
      ny = y + dy[i]
      if (0<=nx<h and 0<=ny<w):
        if graph[nx][ny]: #๋•…์ด๋ฉด
          q.append((nx,ny))
          graph[nx][ny] = 0

๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. ์•„ ์žฌ๋ฐŒ๋‹คใ…... ๋ถ„๋ช…ํžˆ ๋ฌธ์ œ ์•ˆ ํ’€๋ฆด ๋• ๋„ˆ์–ด๋ฌด ์žฌ๋ฏธ์—†์—ˆ๋Š”๋ฐ ใ…‹ใ…Žใ…‹ใ…Žใ…‹ใ…Žใ…‹

 

์ด์ œ while๋ฌธ์„ ํ†ตํ•ด ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•ด์ฃผ์ž.

#<์™„์„ฑ์ฝ”๋“œ>
from collections import deque
import sys
sys.setrecursionlimit(10000)
input = sys.stdin.readline
def dfs(x,y):
  global cnt
  graph[x][y] = 0
  for i in range(8):
    nx = x + dx[i]
    ny = y + dy[i]
    if 0<=nx<h and 0<=ny<w:
      if graph[nx][ny]: #๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ฆ‰, ๋•…์ด๋ฉด
        dfs(nx,ny)
        
def bfs(x,y):
  q = deque()
  q.append( (x,y) )
  while q:
    x,y = q.popleft()
    graph[x][y]=0
    for i in range(8):
      nx = x + dx[i]
      ny = y + dy[i]
      if (0<=nx<h and 0<=ny<w):
        if graph[nx][ny]: #๋•…์ด๋ฉด
          q.append((nx,ny))
          graph[nx][ny] = 0  

#์„ ์–ธ
dx = [-1, -1, -1, 0, 0, 1, 1, 1]
dy = [-1, 0, 1, -1, 1, -1, 0, 1]

while True:
  w, h = map(int, input().split())
  graph = [list(map(int, input().split())) for i in range(h)]
  cnt = 0
  if w == 0 and h == 0: break #์ข…๋ฃŒ์กฐ๊ฑด
    
  for i in range(h):
    for j in range(w):
      if graph[i][j]: #1์ด๋ฉด
        cnt += 1
        bfs(i,j)
        #dfs(i,j)
      
  print(cnt)

๋‹ต์€ ๋˜‘๊ฐ™์ด ๋‚˜์˜ค์ง€๋งŒ, dfs์ผ ๋•Œ, ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋– ์„œ

import sys
sys.setrecursionlimit(10000)

์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋‹ˆ ์ •๋‹ต์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค..

ํŒŒ์ด์ฌ์€ ์—ญ์‹œ๋‚˜ ๋„ˆ๋ฌด ๋ฌด๊ฒ๋‹ค................c++์€ ๊ฐ€๋ฒผ์šด๋ฐ ํ‘ํ‘