본문 바로가기

알고리즘 문제 풀이/Baekjoon

단지번호붙이기 - 2667번 (Python)

반응형
SMALL
from collections import deque

N = int(input())
mat = []
visited = [[1 for _ in range(N)] for __ in range(N)]
dq = deque()
dxdy = [(1, 0), (0, 1), (-1, 0), (0, -1)]
result = []

for _ in range(N):
    strings = input()
    temp_mat = []
    for string in strings:
        temp_mat.append(int(string))
    mat.append(temp_mat)

for i in range(N):
    for j in range(N):
        if mat[i][j] and visited[i][j]:
            dq.append((i, j))
            visited[i][j] = 0
            cnt = 1
            while dq:
                y, x = dq.popleft()
                for _ in dxdy:
                    if 0 <= _[0] + y < N and 0 <= _[1] + x < N and mat[_[0] + y][_[1] + x] and visited[_[0] + y][_[1] + x]:
                        dq.append((_[0] + y, _[1] + x))
                        visited[_[0] + y][_[1] + x] = 0
                        cnt += 1
            result.append(cnt)

print(len(result))
for _ in sorted(result):
    print(_)

지금 생각해보니 굳이 visited를 만들 필요는 없었지만, visited 행렬을 만들어서 처리하는 것이 보다 안전한 방법이라 사용했습니다.

 

확실히 안 썼을 때가 빠르긴 하더군요.

 

이상 단지번호붙이기 - 2667번 였습니다. ^_^

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

10809 - 알파벳 찾기  (0) 2019.08.11
11720 - 숫자의 합 (C)  (0) 2019.08.11
미로 탐색 - 2178 (C++)  (0) 2019.06.28
팩토리얼 - 10872 (C)  (0) 2019.06.22
DFS와 BFS - 1260번 (Python)  (0) 2019.06.21