본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/03 DFS, BFS, 위상정렬

[BFS] 백준 단지번호붙이기 2667번 with Python3

by 금의야행 2021. 8. 25.

 

https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

문제

 

내 풀이

import sys
from collections import deque
input = sys.stdin.readline

# 입력
n = int(input())
gangnam = [list(map(int, list(input().rstrip()))) for _ in range(n)]

visited = [[0] * (n) for _ in range(n)]
ans = []


# 상 우 하 좌
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]


def bfs_2d(r, c):
    count = 1
    que = deque([])
    que.append([r, c])
    visited[r][c] = 1

    while que:
        [x, y] = que.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if (0 <= nx < n) and (0 <= ny < n) and visited[nx][ny] == 0 and gangnam[nx][ny] == 1:
                visited[nx][ny] = 1
                que.append([nx, ny])
                count += 1
    return count


# 답은 알아서 가공 후 제출
danji = 0
for i in range(n):
    for j in range(n):
        if gangnam[i][j] == 1 and visited[i][j] == 0:
            temp = bfs_2d(i, j)
            ans.append(temp)
            danji += 1

print(danji)
ans.sort()
for i in range(len(ans)):
    print(ans[i])

해설

2차원 상하좌우 이동 문제 중 가장 정석적인 방식으로 진행되는 문제라고 생각합니다.

 

댓글