์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[BoJ][Python] 4963 ์„ฌ์˜ ๊ฐœ์ˆ˜

jihuSunbae 2024. 12. 5. 23:13

๋ชฉ์ฐจ

    ๐Ÿซก Overview

    ์ฒด๊ฐ ๋‚œ์ด๋„: โ˜…โ˜†โ˜†โ˜†โ˜†

    ์†Œ์š”์‹œ๊ฐ„: 20๋ถ„

    ๋ฌธ์ œ ๋ ˆ๋ฒจ: ์‹ค๋ฒ„2 / ๋ฌธ์ œ ์œ ํ˜•: BFS
    ํ’€์ด ์ƒํƒœ:  ์Šค์Šค๋กœ ํ•ด๊ฒฐ
    ์ถ”ํ›„: ์™„๋ฒฝ ์ดํ•ด

     


    ๋ฌธ์ œ ๋งํฌ

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

    ๋‚˜์˜ ์ฝ”๋“œ

    ๋”๋ณด๊ธฐ
    """
    ์„ฌ์˜ ๊ฐœ์ˆ˜
    
    ๊ฐ™์€ ์„ฌ: ์ƒ,ํ•˜, ์ขŒ, ์šฐ, ๋Œ€๊ฐ์„ 
    1: ๋•…, 0์€ ๋ฐ”๋‹ค
    
    """
    from collections import deque
    def BFS(board, i, j):
        d_lst = [(0,1),(0,-1),(1,0),(-1,0), (+1,1),(+1,-1),(-1,1),(-1,-1)]
        global visited
        queue = deque()
    
        visited[i][j] = True
        queue.append((i,j))
    
        while queue:
            x,y = queue.popleft()
            for dx, dy in d_lst:
                nx, ny = x+dx, y+dy
                if nx < 0 or nx >= h or ny<0 or ny>=w:
                    continue
                if not visited[nx][ny] and board[nx][ny] == 1:
                    visited[nx][ny] = True
                    queue.append((nx,ny))
    
    while True:
        global visited
        # ์ž…๋ ฅ ๋ฐ›๊ธฐ
        w, h = list(map(int, input().split()))  # w: ์—ด์˜ ๊ฐœ์ˆ˜, h: ํ–‰์˜ ๊ฐœ์ˆ˜, 1<=w,h<=50
        if w == 0  and h == 0:  break
        board = [list(map(int,input().split())) for _ in range(h)]
        # ๊ฒ€์‚ฌ
        visited = [[False]*w for _ in range(h)]
        ans = 0
        for i in range(h):
            for j in range(w):
                if not visited[i][j] and board[i][j] == 1:
                    BFS(board,i,j)
                    ans += 1
        print(ans)