
https://www.acmicpc.net/problem/4963
4963번: 섬의 개수
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도
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)
| [백준 / 파이썬] 1697. 숨바꼭질 (0) | 2023.03.26 |
|---|---|
| [ 백준 / 파이썬 ] 2468. 안전 영역 (0) | 2023.03.25 |
| [ 백준 / 파이썬 ] 14502. 연구소 (0) | 2023.03.23 |
| [ 백준 / 파이썬 ] 7562. 나이트의 이동 (0) | 2023.03.23 |
| [ 백준 / 파이썬 ] 10026. 적록색약 (0) | 2023.03.22 |