2022.01.07
백준 2667 단지 번호 붙이기
#2667 단지번호붙이기
from collections import deque
N = int(input())
arr = [list(map(int,input())) for i in range(N)]
visited = [[False]*N for i in range(N)] # 한 번 들른 곳은 방문처리
dx = [-1, 0, 0, 1] # 상하좌우의 좌표를 이용하기 위해서
dy = [0, 1, -1, 0]
R = [] # 단지 내 아파트 숫자를 저장하려는 리스트
def BFS(x,y):
queue = deque()
queue.append((x,y)) # (x,y)로 append하면 pop할 때 두 x,y를 한 번에 꺼낼 수 있다
num = 0 # 단지 내 아파트 숫자 세기
if arr[x][y] == 1 and visited[x][y] == False:
num += 1
visited[x][y] = True
while queue:
v,b = queue.popleft()
for i in range(4):
nx = v + dx[i]
ny = b + dy[i]
if 0<=nx<N and 0<=ny<N:
if arr[nx][ny] == 1 and visited[nx][ny] == False:
queue.append((nx,ny))
visited[nx][ny] = True
num += 1
return R.append(num)
for i in range(N):
for j in range(N): # 반복문 두개 돌려서 좌표 (0,0) 부터 (N-1,N-1)까지 확인
if arr[i][j] == 1 and visited[i][j] == False:
BFS(i,j)
print(len(R))
for i in sorted(R):
print(i)
deque에 좌표(x,y)를 append 해서 한 번에 꺼내는 것을 몰랐다면 더욱 지저분한 코드가 되었을 것 같다.
return을 해주는 위치랑 nx,ny 범위 지정을 잘못했는데 못 찾아서 한참을 헤맸다.
DFS로 풀 때와 다른점은 좌표의 범위 제한을 while구문 안에 넣은 것과 visited를 사용한 점이다.
숙달되려면 멀었다. 더 많은 관련 문제를 풀어봐야지