코딩테스트

[백준][파이썬]4963번: 섬의 개수

과아아앙 2021. 7. 4. 15:46

문제 출처 : https://www.acmicpc.net/problem/4963

 

4963번: 섬의 개수

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

www.acmicpc.net

내 풀이

from collections import deque

def check(a, b):
    map1[a][b]
    queue = deque()
    queue.append([a, b])
    while queue:
        a, b = queue.popleft()
        for i in range(8):
            x = a + move[i][0]
            y = b + move[i][1]
            if 0 <= x < h and 0 <= y < w and map1[x][y] == 1:
                map1[x][y] = 0
                queue.append([x,y])
    
move = [[1, 0], [-1, 0], [0, 1], [0, -1], [1, -1], [-1, -1], [1, 1], [-1, 1]]

while True:
    w, h = map(int, input().split())
    
    map1 = []
    answer = 0
    
    if w == 0 and h == 0:
        break
    for i in range(h):
        map1.append(list(map(int, input().split())))
    for i in range(h):
        for j in range(w):
            if map1[i][j] == 1:
                check(i, j)
                answer += 1            
    print(answer)

설명

BFS를 이용해서 풀었다.

단 상하좌우로만 이동하는 것이 아닌 대각선 까지 체크해줘야했기에 이동에 대각선으로 향하는 좌표까지 추가해줬다.