반응형
[Silver II] 섬의 개수 - 4963
https://www.acmicpc.net/problem/4963
문제설명
정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.

한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다.
둘째 줄부터 h개 줄에는 지도가 주어진다. 1은 땅, 0은 바다이다.
입력의 마지막 줄에는 0이 두 개 주어진다.
출력
각 테스트 케이스에 대해서, 섬의 개수를 출력한다.
예제입력 / 예제출력
문제이해 및 코드설명
탐색문제로 dfs를 활용하여 풀었다. 다른 사람의 코드들을 보니 bfs로도 풀린다고한다. sys.setrecursionlimit(10**9)라는 코드를 사용하였는데, 이 코드는 재귀를 사용해서 문제를 푸는 경우 필수적으로 사용되는 코드이다. 파이썬 기본 재귀 깊이 제한이 1000으로 매우 얇은 편이기 때문인데, 이 코드를 사용하면 제한에 관련된 에러를 방지할 수 있다. 우선 상하좌우 대각선을 살펴보기 전에, 범위를 벗어나는 경우 False로 처리해 준 후 섬인 경우 재귀로 탐색하며 방문 표시를 해주었다. 연결된 곳을 모두 방문하며 덩어리의 개수를 구해주었다.
코드
import sys
sys.setrecursionlimit(10 ** 9)
def dfs(x,y):
# 범위 벗어나는 경우 건너뛰기
if x < 0 or x >= w or y < 0 or y >= h:
return False
# 바다인경우 건너뛰기
# if graph[x][y]==0:
# return False
# 섬인경우 재귀
if graph[x][y] == 1:
#방문처리
graph[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
return False
# 0 0이 나오면 그만하기
while True:
h,w = map(int,input().split())
if w == 0 & h ==0 :
break
graph = []
for _ in range(w):
graph.append(list(map(int,input().split())))
result = 0
for i in range(w):
for j in range(h):
if dfs(i,j) == True:
result += 1
print(result)
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
백준 - 괄호 9012 (Python) (0) | 2023.03.07 |
---|---|
백준 - 피보나치 9009 (Python) (0) | 2023.03.07 |
백준 - 균형잡힌 세상 4949 (Python) (0) | 2023.03.07 |
백준 - 사탕게임 3085 (Python) (0) | 2023.03.07 |
백준 - 촌수계산 2644 (Python) (0) | 2023.03.06 |