백준 2667 단지번호붙이기 - python

원준식·2022년 1월 3일
0

백준

목록 보기
9/10
from collections import deque

N = int(input())
graph = []
graph.append([0 for _ in range(N+2)])
for _ in range(N):
    t = input()
    tt = [0]
    for i in range(N):
        tt.append(int(t[i]))
    tt.append(0)
    graph.append(tt)
graph.append([0 for _ in range(N+2)])

def bfs(graph, a, b):
    queue = deque([[a, b]])
    graph[a][b] = 0
    ans = 1
    while queue:
        v = queue.popleft()
        p = v[0]
        q = v[1]
        for i in range(p-1, p+2):
            for j in range(q-1, q+2):
                if i+j == p+q-1 or i+j == p+q+1:
                    if graph[i][j] == 1:
                        queue.append([i, j])
                        graph[i][j] = 0
                        ans += 1
    return ans


answer = []
for i in range(1, N+1):
    for j in range(1, N+1):
        if graph[i][j] == 1:
            answer.append(bfs(graph, i, j))
print(len(answer))
for x in sorted(answer):
    print(x)

queue를 이용해 BFS로 풀었습니다.

graph를 탐색할 때, 첫 번째 행의 요소를 기준으로 위쪽의 점을 탐색하지 못합니다.
마찬가지로, 첫 번째 열의 요소를 기준으로는 왼쪽의 점을 탐색하지 못합니다.

이러한 것들에 조건을 붙여주지 않고 1행, 1열, 마지막 행, 마지막 열을 0(집이 없는 곳)으로 덮고 시작했습니다.
예를 들어, 기존 graph가 [[1, 0, 1], [1, 0, 1], [0, 0, 1]]이라면 제가 만든 graph는 [[0, 0, 0, 0, 0], [0, 1, 0, 1, 0], [0, 1, 0, 1, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 0]]입니다.

이렇게 풀면 조금 더 편하게 풀 수 있을 것이라고 생각했습니다.

0개의 댓글