[백준] 단지 번호 붙이기
[백준] 단지 번호 붙이기
문제
링크 : 백준
풀이
지도가 주어질 때, 단지 수와 단지 내의 아파트 수를 구하는 문제이다.
이 문제는 bfs, dfs 모두를 이용해서 풀어봤다.
여기서 중요한 점은 단지 수, 아파트 수를 세는 것인데
단지 수를 세기 위해서는 탐색을 들어갈 때 카운트를 하고
아파트 수를 세기 위해서는 탐색에서 카운트한 값을 가져온다.
# BFS
n = int(input())
graph = [list(map(int,input())) for _ in range(n)]
visit = [[0] * n for _ in range(n)]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
from collections import deque
def bfs(x, y, graph, start):
deq = deque()
deq.append([x, y])
graph[x][y] = 0
l = len(graph[x])
while deq:
x,y = deq.popleft()
for i in range(4):
mx = x + dx[i]
my = y + dy[i]
if mx >= 0 and my >= 0 and mx < l and my < l:
if graph[mx][my] == 1 and visit[mx][my] == 0:
deq.append([mx, my])
visit[mx][my] = 1
start += 1
return start
def solution(graph, n):
answer = [0]
count = []
for i in range(n):
for j in range(n):
if graph[i][j] == 1 and visit[i][j] == 0:
count.append(bfs(i, j, graph, 1))
answer[0] += 1
count = sorted(count)
answer.extend(count)
for i in range(len(answer)):
print(answer[i])
solution(graph, n)
# DFS
n = int(input())
graph = [list(map(int,input())) for _ in range(n)]
visit = [[0] * n for _ in range(n)]
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
from collections import deque
def dfs(x, y, ans):
for i in range(4):
mx = x + dx[i]
my = y + dy[i]
if mx >= 0 and mx < n and my >= 0 and my < n:
if graph[mx][my] == 1 and visit[mx][my] == 0:
visit[mx][my] = 1
ans = dfs(mx, my, ans + 1)
return ans
def solution(graph, n):
answer = [0]
count = []
for i in range(n):
for j in range(n):
if graph[i][j] == 1 and visit[i][j] == 0:
visit[i][j] = 1
count.append(dfs(i, j, 1))
answer[0] += 1
count = sorted(count)
answer.extend(count)
for i in range(len(answer)):
print(answer[i])
solution(graph, n)
실수 및 배운 점
-
bfs에서는 deque 활용, 방향 설정을 내가 알기 쉽게 설정하자.
-
dfs에서 return값을 어떻게 잡아야할지 감이 안섰다.
global로 dfs에 접근할 때마다 카운트하려 했으나 가능한 쓰지 않는게 좋다길래,,
함수 내에서 해결하기로 했다. -
dfs에서 ans값을 어떻게 이리저리 하면 되지 않을까하고 고민했다.
dfs에 들어갈 때마다 ans += 1 해주고 나올 때 ans 값을 리턴했다.
조금 헷갈렸지만.. 생각하다보니 이게 맞는 것 같다.