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

[BFS] 백준 섬의 개수 2588번 with Python3

by 금의야행 2021. 8. 25.

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

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

문제

 

내 풀이

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

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


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

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

            if (0 <= nx < h) and (0 <= ny < w) and visited[nx][ny] == 0 and sea[nx][ny] == 1:
                visited[nx][ny] = 1
                que.append([nx, ny])


while True:
    # 입력
    w, h = map(int, input().split())
    sea = [list(map(int, input().split())) for _ in range(h)]

    # 종료조건
    if w == 0 and h == 0:
        exit()

    visited = [[0] * (w) for _ in range(h)]
    count = 0

    for i in range(h):
        for j in range(w):
            if sea[i][j] == 1 and visited[i][j] == 0:
                bfs_2d(i, j)
                count += 1

    print(count)

해설

상우하좌 이동에서 대각선까지 포함하게된 문제. 크게 다를 점은 없다.

댓글