algorithm/baekjoon
[백준] 1012번 유기농 배추(파이썬)
support_u
2023. 3. 5. 07:50
문제
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
DFS BFS 재귀방식으로 풀 수 있다.
주의
런타임 에러 (RecursionError)가 발생한다면
재귀함수 특성상 최대깊이가 깊어져서 발생하는 것이니 아래 코드를 꼭 넣어주자!
import sys
sys.setrecursionlimit = 10**6
코드
DFS
import sys
input = sys.stdin.readline
sys.setrecursionlimit = 10**6
def dfs(graph, visited, i, j):
global Y, X
for _ in range(4):
I = i + dx[_]
J = j + dy[_]
if 0 <= I < X and 0 <= J < Y and graph[I][J] == 1 and visited[I][J] == False:
visited[I][J] = True
dfs(graph, visited, I, J)
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
n = int(input())
for _ in range(n):
Y, X, K = map(int, input().split())
graph = [[0] * Y for _ in range(X)]
visited = [[False] * Y for _ in range(X)]
for k in range(K):
y, x = map(int, input().split())
graph[x][y] = 1
cnt = 0
for i in range(X):
for j in range(Y):
if graph[i][j] == 1 and visited[i][j] == False:
visited[i][j] = True
dfs(graph, visited, i, j)
cnt += 1
print(cnt)
BFS
from collections import deque
import sys
input = sys.stdin.readline
sys.setrecursionlimit = 10**6
def bfs(graph, visited, i, j):
global Y, X
q = deque([(i, j)])
visited[i][j] = True
while q:
i, j = q.popleft()
for _ in range(4):
I = i + dx[_]
J = j + dy[_]
if 0 <= I < X and 0 <= J < Y and graph[I][J] == 1 and visited[I][J] == False:
q.append((I, J))
visited[I][J] = True
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
n = int(input())
for _ in range(n):
Y, X, K = map(int, input().split())
graph = [[0] * Y for _ in range(X)]
visited = [[False] * Y for _ in range(X)]
for k in range(K):
y, x = map(int, input().split())
graph[x][y] = 1
cnt = 0
for i in range(X):
for j in range(Y):
if graph[i][j] == 1 and visited[i][j] == False:
bfs(graph, visited, i, j)
cnt += 1
print(cnt)
해설
함수를 이용해서 재귀하여 푸는 문제이다.
내 입력을 받는 graph와 방문 기록을 체크하는 visited를 만든다.
DFS는 방문하지 않고 벌레가 있는 곳(=1)에 들어가서 재귀를 하면서 한 벌레가 관리하는 곳을 체크한다.
더이상 체크할 곳이 없으면 cnt+=1를 하여 벌레 한마리를 센다.
BFS는 방문하지 않고 벌레가 있는 곳(=1)의 자리를 q에 넣는다.
q가 없을 때까지 while 문을 반복한다.
q에서 제일 앞에 있는 것을 체크하고 pop한다.
체크 된 부분에 들어거서 4반향 중 연결 된 부분을 모두 체크한다.
q가 없을 때까지 while 문을 반복한다