728x90
반응형
문제
https://www.acmicpc.net/problem/4963
해설
반응형
이 문제는 좌표를 dx, dy에 저장하고 dfs 혹은 bfs로 풀면 된다.
좌표를 이용한 그래프 탐색 문제는 처음 풀어서 어떤 식으로 풀어야 하는지 당황스러웠는데
이런건 가장 이해하기 쉽게 푼 다른 사람 코드를 보고 외우는게 최고인 것 같다.
코드
-파이썬
#백준 4963(섬의 개수)
# 1 : 땅, 0 : 바다
#dfs 풀이
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10000)
def dfs(x, y):
dx = [-1, 0, 1, -1, 1, -1, 0, 1]
dy = [1, 1, 1, 0, 0, -1, -1, -1]
field[x][y] = 0 #시작점
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < h and 0 <= ny < w and field[nx][ny] == 1:
dfs(nx, ny)
while True:
w, h = map(int, input().split()) #너비, 높이
cnt = 0 #섬 개수
if w == 0 and h == 0:
break
field = [] #지도
for _ in range(h):
field.append([*map(int, input().split())])
for i in range(h):
for j in range(w):
if field[i][j] == 1: #땅일 경우
dfs(i, j)
cnt += 1
print(cnt)
-----------------------------------------------------------------------
#bfs 풀이
from collections import deque
import sys
input = sys.stdin.readline
def bfs(x, y):
dx = [-1, 0, 1, -1, 1, -1, 0, 1]
dy = [1, 1, 1, 0, 0, -1, -1, -1]
field[x][y] = 0 #시작점
Q = deque([(x, y)])
while Q:
a, b = Q.popleft()
for i in range(8):
nx = a + dx[i]
ny = b + dy[i]
if 0 <= nx < h and 0 <= ny < w and field[nx][ny] == 1:
field[nx][ny] = 0
Q.append([nx, ny])
while True:
w, h = map(int, input().split()) #너비, 높이
cnt = 0 #섬 개수
if w == 0 and h == 0:
break
field = [] #지도
for _ in range(h):
field.append([*map(int, input().split())])
for i in range(h):
for j in range(w):
if field[i][j] == 1: #땅일 경우
bfs(i, j)
cnt += 1
print(cnt)
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[파이썬] BOJ_9012(괄호) (0) | 2023.06.26 |
---|---|
[파이썬] BOJ_10448(유레카 이론) (0) | 2023.06.24 |
[파이썬] BOJ_3273(두 수의 합) (0) | 2023.06.12 |
[파이썬] BOJ_2605(줄 세우기) (0) | 2023.06.11 |
[파이썬] BOJ_2810(컵홀더) (0) | 2023.06.09 |