DHistory

[Baekjoon] DFS/BFS - 4963 섬의 개수 본문

Computer Science/Algorithm

[Baekjoon] DFS/BFS - 4963 섬의 개수

ddu0422 2023. 9. 4. 15:48

문제

 

4963번: 섬의 개수

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

www.acmicpc.net

 

풀이

import sys
from collections import deque


dx = [-1, -1, -1, 0, 1, 1, 1, 0]
dy = [1, 0, -1, -1, -1, 0, 1, 1]


def solution(graphs, x, y, visited, n, m):
    if visited[x][y] or not graphs[x][y]:
        return False

    queue = deque([(x, y)])
    visited[x][y] = True

    while queue:
        x, y = queue.popleft()

        for i in range(len(dx)):
            nx = x + dx[i]
            ny = y + dy[i]
            
            if not (0 <= nx < n and 0 <= ny < m):
                continue

            if visited[nx][ny] or not graphs[nx][ny]:
                continue

            queue.append((nx, ny))
            visited[nx][ny] = True

    return True


for line in sys.stdin:
    x, y = map(int, line.rstrip().split())
    if x == 0 and y == 0:
        break

    graphs = []
    for _ in range(y):
        graphs.append(list(map(int, sys.stdin.readline().rstrip().split())))
    visited = [[False for _ in range(x)] for _ in range(y)]

    answer = 0

    for row in range(x):
        for column in range(y):
            if solution(graphs, column, row, visited, y, x):
                answer += 1

    print(answer)

 

채점 결과