[백준] 4963 : 섬의 개수 - Python

Chooooo·2023년 2월 7일
0

알고리즘/백준

목록 보기
41/182

문제

정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.

한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.

두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.

입력

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

둘째 줄부터 h개 줄에는 지도가 주어진다. 1은 땅, 0은 바다이다.

입력의 마지막 줄에는 0이 두 개 주어진다.

출력

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

import sys
sys.stdin = open("input.text", "rt")
sys.setrecursionlimit(10000)

#가로 세로 대각선으로 걸어갈 수 있음. 
dx = [1,-1,0,0,1,1,-1,-1]
dy = [0,0,-1,1,1,-1,1,-1]  #총 8 가지 확인

def DFS(x,y):
    g[x][y] = 0 #방문 표시
    for i in range(8):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0<=nx<h and 0<=ny<w:
            if g[nx][ny] == 1: #섬
                DFS(nx,ny)
    
while True:
    w,h = map(int ,input().split()) #가로 세로
    if w == 0 and h == 0:
        break
    #각 테스트 케이스에 대해 섬의 개수    
    cnt = 0
    g = []
    for i in range(h):
        g.append(list(map(int, input().split())))
    for i in range(h):
        for j in range(w):
            if g[i][j] == 1: #섬
                cnt += 1
                DFS(i,j)
    print(cnt)
                

⚽ 코멘트

이 문제는 DFS, BFS모두 사용가능하다.
나는 DFS로 풀었는데 백준에서 무한 재귀호출 방지를 위해 sys.setrecursionlimit(10000)을 꼭 설정해주자.

코드가 맞더라도 이것 때문에 런타임에러가 걸린다.
이 문제는 상하좌우에 더해서 대각선까지 확인해야 했다.

이 문제 같은 경우가 그래프 선언할 때 전부 0으로 초기화 해놓고 시작해도 되는 문제 유형이다.

물론 처음부터 입력 다 받아도 됨.

역시 섬의 개수(연결 요소의 개수)이므로 전체 반복문 돌다가 g[i][j] == 1인 경우 dfs를 호출해주는데, 그 안에서 이제 현재 위치를 방문 표시 (g[x][y] = 0)해주고 다시 현재 위치에서 8개의 좌표를 탐색하면서 체크를 해주면 된다. 이전 문제들과 다를 바 없이 풀면 해결된다.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글