본문 바로가기
알고리즘

백준_4963_섬의 개수

by 매화of사군자 2020. 1. 20.

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

 

4963번: 섬의 개수

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

www.acmicpc.net

 

해결 방법

> DFS를 이용한다.

 

고찰

> 문제를 보자마자 입력을 어떻게 받아야 할지 고민하였다. 줄마다 입력 개수가 다르기 떄문이다.

> import sys

> input = sys.stdin.readline을 이용한다.

 

참고 자료

> https://rebas.kr/655

 

BOJ 4963 · 섬의 개수

알고리즘 분류 : DFS 섬의 개수를 세는 문제다. 섬은 인접한 땅으로 이루어져 있고, 인접의 기준은 센터를 중심으로 8방향(상하좌우대각선)으로 한 칸씩 떨어진 곳이다. 4방향 인접 문제에서 방향만 추가해서 구..

rebas.kr

해결하지 못한 부분

> 백준에서 런타임에러가 나는데 참고한 자료와 차이점을 발견하지 못하여 통과하지 못하였다.

 

코드

더보기

import sys

sys.setrecursionlimit(10000#재귀함수 한계 설정

input = sys.stdin.readline  #readline

 

dx = [-1,-1,-1,0,1,1,1,0]

dy = [-1,0,1,1,1,0,-1,-1]

 

while True:

    n, m = map(intinput().split())

 

    if n == 0 and m == 0#런타임에러 수정 부분

        break

 

    island = [list(map(int,input().split())) for i in range(m)] #input

    check = [[False]*n for i in range(m)]   #연결되어 있는지 확인

 

    def dfs(xy):  #입력 케이스에 대해 섬의 연결을 확인하는 부분

        check[x][y] = True

        for i in range(8):

            nx, ny = x + dx[i], y + dy[i]

            if nx < 0 or nx >= m or ny < 0 or ny >= n:

                continue

            if island[nx][ny] == 1 and check[nx][ny] is False:

                dfs(nx, ny)

 

    count = 0

    for i in range(m):

        for j in range(n):

            if island[i][j] == 1 and check[i][j] is False:

                dfs(i, j)

                count += 1

 

    print(count)    

 

'알고리즘' 카테고리의 다른 글

백준_1671_상어의 저녁식사(못풀었음)  (0) 2020.01.22
백준_11404_플로이드  (0) 2020.01.21
백준_1389_케빈 베이컨의 6단계 법칙  (0) 2020.01.17
백준_2178_미로 탐색  (0) 2020.01.16
백준_7576_토마토  (0) 2020.01.15

댓글