Skip to content

Commit e368c31

Browse files
committed
[BOJ]#4963. 섬의개수/실버2/55분
https://www.acmicpc.net/problem/4963
1 parent 88278ad commit e368c31

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

Hongjoo/백준/섬의개수.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"""
2+
https://www.acmicpc.net/problem/4963
3+
# 유형 : 그래프 탐색 (DFS/BFS)
4+
- goal) 지도 속 섬 군집 개수 구하기
5+
- 각 섬은 가로,세로,대각선 연결 가능
6+
- 땅은 1, 바다는 0
7+
- 지도 밖은 바다 0
8+
- 입력은 다중 테스트 케이스 -> grid [W,h] => 출력 : 각 테스트 케이스별로 섬의 개수 출력
9+
#flow
10+
1) 지도 2배열 입력 받기
11+
2) 방문 등록 여부 확인 = 섬 군집 개수 반환 by dfs
12+
1 = 방문 x 땅, -1 방문한 땅 , 0 바다
13+
2-1) dfs
14+
"""
15+
# 1. 각 테스트 케이스 분리
16+
# 입력 0,0 전까지 계속 입력 받기
17+
import sys
18+
from collections import deque
19+
input = sys.stdin.readline
20+
# 상하좌우 + 대각선 4개 = 8방위 이동
21+
dy = [-1, 1, 0,0 , -1,-1,1,1]
22+
dx = [0,0,-1,1 , -1,1,-1,1]
23+
24+
25+
while True :
26+
W,H = map(int, input().split())
27+
# 입력 종료 조건
28+
if W == 0 and H == 0 :
29+
break
30+
# 지도 입력 받기
31+
field = [ [0 for _ in range(W)] for k in range(H)]
32+
for i in range(H) :
33+
field[i] =list(map(int, input().split()))
34+
# 군집 탐색
35+
def bfs (s_y,s_x):
36+
q = deque()
37+
q.append([s_y,s_x])
38+
field[s_y][s_x] = -1 # -1 방문 등록
39+
while q :
40+
c_y, c_x = q.popleft()
41+
for i in range(8):
42+
n_y , n_x = c_y + dy[i] , c_x + dx[i]
43+
# 지도 내부 범위 확인
44+
if 0<= n_y < H and 0<= n_x < W :
45+
# 방문 등록 안한 곳 + 바다 아닌 섬임
46+
47+
if field[n_y][n_x] > 0 :
48+
q.append([n_y , n_x])
49+
field[n_y][n_x] = -1
50+
51+
cnt = 0
52+
for i in range(H):
53+
for j in range(W):
54+
if field[i][j] > 0 :
55+
bfs(i, j)
56+
# print(f"@{cnt}")
57+
# print(f"{field}")
58+
cnt+=1
59+
60+
print(f"{cnt}")
61+
62+
63+
64+
65+
66+
67+

0 commit comments

Comments
 (0)