본문 바로가기
백준(Python) 풀이

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

by yewonnie 2022. 4. 8.

문제

정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.
한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다. 
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.

입력

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

출력

각 테스트 케이스에 대해서, 섬의 개수를 출력한다.

문제 풀이

가로, 세로 또는 대각선으로 연결되어 있는 사각형으로만 걸어갈 수 있습니다.

두 땅이 같은 섬에 있으려면 다른 사각형으로 걸어서 갈 수 있는 경로가 있어야 합니다.

따라서, 걸어갈 수 있는 사각형을 모두 탐색하면 하나의 섬을 의미합니다.

단, 지도는 바다로 둘러싸여 있어 밖으로 나갈 수 없습니다.

 

DFS 알고리즘을 이용해 문제를 해결했습니다.

각 칸의 위치에서 땅일 경우 방문했음을 표시하기 위해 0으로 만들어준 뒤

가로, 세로 또는 대각선으로 탐색을 수행해주었습니다. 

만약 걸어갈 수 있는 사각형을 모두 탐색하면 섬의 개수를 세어주면 됩니다.

 

입력으로 0, 0이 입력 되면 프로그램이 종료되도록 해주었습니다.

또한 재귀한도를 sys.setrecursionlimit(재귀 한도)를 이용해 늘려주었습니다.


My Code

import sys
sys.setrecursionlimit(100000)

def dfs(x, y):
    if x < 0 or x >= h or y < 0 or y >= w: # 바다를 만나면 False
        return False

    if maps[x][y] == 1: # 땅일 경우
        maps[x][y] = 0  # 방문했음을 표시
        # 가로, 세로 또는 대각선으로 탐색
        dfs(x - 1, y)
        dfs(x + 1, y)
        dfs(x, y - 1)
        dfs(x, y + 1)
        dfs(x - 1, y - 1)
        dfs(x - 1, y + 1)
        dfs(x + 1, y - 1)
        dfs(x + 1, y + 1)
        return True        # 탐색 완료하면 True
    
    return False

while True:
    w, h = map(int,input().split()) # 지도 너비, 높이

    if w == 0 and h == 0: # 0, 0이 입력되면 종료
        break

    maps = []  # 지도
    for _ in range(h):
        maps.append(list(map(int,input().split())))

    result = 0
    for i in range(h):
        for j in range(w):
            if dfs(i, j):    # 탐색을 완료하면 섬의 개수 count
                result += 1
    
    print(result)

댓글