백준 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 DFS와 BFS 두 방법으로 풀 수 있는 문제였다. BFS의 경우 queue을 이용해서 차례대로 구역 안의 1인 영역을 찾아내었고, DFS의 경우 재귀를 통해 찾아내었다.