백준 2667번 바로가기

DFS을 이용한 풀이

# 입력
import sys

read = sys.stdin.readline

n = int(read().strip())
graph = []
for _ in range(n):
  graph.append(list(map(int, read().strip())))

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]


# 처리 - dfs 활용
def DFS(x, y):
  if not 0<=x<n or not 0<=y<n:
    return False
  if graph[x][y] == 1:
    global count
    count += 1
    graph[x][y] = 0
    for i in range(4):
      nx, ny = x + dx[i], y + dy[i]
      DFS(nx, ny)
    return True
  return False

count = 0
ans = []
for i in range(n):
  for j in range(n):
    if DFS(i,j):
      ans.append(count)
      count = 0

print(len(ans))
for a in sorted(ans):
  print(a)

BFS를 이용한 풀이

# 입력
import sys

read = sys.stdin.readline

n = int(read().strip())
graph = []
for _ in range(n):
  graph.append(list(map(int, read().strip())))

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]


# 처리 - BFS 활용
def BFS(x, y):
  from collections import deque
  queue = deque([(x,y)])
  graph[x][y] = 0
  count = 1

  while queue:
    x,y = queue.popleft()
    for i in range(4):
      nx, ny = x + dx[i], y + dy[i]
      if 0<=nx<n and 0<=ny<n and graph[nx][ny] == 1:
        graph[nx][ny] = 0
        queue.append((nx,ny))
        count += 1
  return count

count = 0
ans = []
for i in range(n):
  for j in range(n):
    if graph[i][j] == 1:
      ans.append(BFS(i,j))
      count = 0

print(len(ans))
for a in sorted(ans):
  print(a)

CODE REVIEW

  1. DFS와 BFS 두 방법으로 풀 수 있는 문제였다.
  2. BFS의 경우 queue을 이용해서 차례대로 구역 안의 1인 영역을 찾아내었고,
  3. DFS의 경우 재귀를 통해 찾아내었다.