(백준/파이썬) 4963. 섬의 수


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

4963:섬의 수

입력은 여러 테스트 케이스로 구성됩니다.

각 테스트 케이스의 첫 번째 줄은 맵의 너비 w와 높이 h를 제공합니다.

w와 h는 50보다 작거나 같은 양의 정수입니다.

두 번째 행부터 h-line은 카드입니다.

www.acmicpc.net

문제

사각형으로 구성된 섬과 바다의 지도를 얻을 수 있습니다.

섬의 수를 세는 프로그램을 작성하세요.


설명

문제를 셀 때 dfs로 푸는 습관이 있습니다.

. .


그러나 오늘은 재귀 깊이 제한을 반드시 해제하지 않았기 때문에 RecursionError가 발생했습니다.

import sys
sys.setrecursionlimit(10000)

놓치지 말자

일반적인 지역 찾기 문제지만 8방향으로 찾아야 한다는 차이가 있을 뿐입니다.

암호

import sys
sys.setrecursionlimit(10000)

def dfs(ground, visited, i, j, w, h):
    visited(i)(j) = True

	#12시 방향부터 시계방향으로 돌았을 때 좌표
    di = (-1, -1, 0, 1, 1, 1, 0, -1)
    dj = (0, 1, 1, 1, 0, -1, -1, -1)

    for k in range(8):
        ni = i+di(k)
        nj = j+dj(k)

		#범위 안에 있고, 건너갈 수 있는데 방문 전인 섬이라면 이어져 있다
        if 0 <= ni < h and 0 <= nj < w:
            if not visited(ni)(nj) and ground(ni)(nj) == 1:
                dfs(ground, visited, ni, nj, w, h)



while True:
    w, h = map(int, input().split())

	#종료 시 0 0이 입력된다
    if w == 0 and h == 0:
        break

    ground = (list(map(int, input().split())) for _ in range(h))

    visited = ((False)*w for _ in range(h))

    cnt = 0 #섬의 개수
    for i in range(h):
        for j in range(w):
            #아직 탐색하지 않은 섬이라면
            if not visited(i)(j) and ground(i)(j) == 1:
            	#이어진 섬 탐색
                dfs(ground, visited, i, j, w, h)
                #섬의 개수 추가
                cnt += 1

    print(cnt)