문제 설명
https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
문제 풀이
이 문제는 BFS, DFS 두 방법 다 사용 가능하다
그래서 두 가지 방법으로 풀어보았다!
1. DFS
배추가 심어진 땅의 개수를 구하는 것이기 때문에 가장 먼저 DFS로 푸는 방법을 떠올렸다
재귀를 돌면서 아직 방문하지 않았으면서 값이 1인 부분을 찾고, 재귀가 끝나면 return True를 해준다
반복문으로 dfs 함수를 호출해 true면 result를 증가해준다
import sys
sys.setrecursionlimit(10000)
def dfs(x, y):
if x < 0 or x >= n or y < 0 or y >= m:
return False
if not visited[x][y] and ground[x][y] == 1:
visited[x][y] = True
for p in range(4):
nx = x + dx[p]
ny = y + dy[p]
dfs(nx, ny)
return True
return False
TC = int(input())
for t in range(TC):
m, n, k = map(int, input().split())
ground = [[0] * m for _ in range(n)]
visited = [[False] * m for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(k):
a, b = map(int, input().split())
ground[b][a] = 1
result = 0
for i in range(m):
for j in range(n):
if dfs(j, i):
result += 1
print(result)
2. BFS
BFS는 상하좌우를 확인하면서 아직 방문하지 않았고, 값이 1이면 큐에 넣어주고
큐에서 pop해가면서 확인하면 된다
넘 쉬운 문제
from collections import deque
def bfs(x, y):
queue = deque()
queue.append((x, y))
visited[x][y] = True
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if graph[nx][ny] == 1 and not visited[nx][ny]:
queue.append((nx, ny))
visited[nx][ny] = True
return True
T = int(input())
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for t in range(T):
m, n, k = list(map(int, input().split()))
graph = [[0 for _ in range(m)] for __ in range(n)]
visited = [[False] * m for _ in range(n)]
point = []
result = 0
for _ in range(k):
a, b = map(int, input().split())
graph[b][a] = 1
point.append((b, a))
for p in point:
a, b = p
if not visited[a][b] and graph[a][b] == 1:
bfs(a, b)
result += 1
print(result)
참고로 검색 대상이 엄청 크지 않으면 단순 속도는 BFS가 더 빠르다

'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2579 - 계단 오르기 (Python) (1) | 2023.11.21 |
---|---|
[백준] 9095 - 1, 2, 3 더하기 (Python) (0) | 2023.11.21 |
[백준] 1463 - 1로 만들기 (Python) (1) | 2023.11.20 |
[백준`G5] 10026 - 적록색약 (Python) (0) | 2023.11.18 |
[백준] 1697 - 숨바꼭질 (Python) (2) | 2023.11.14 |
문제 설명
https://www.acmicpc.net/problem/1012
1012번: 유기농 배추
차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에
www.acmicpc.net
문제 풀이
이 문제는 BFS, DFS 두 방법 다 사용 가능하다
그래서 두 가지 방법으로 풀어보았다!
1. DFS
배추가 심어진 땅의 개수를 구하는 것이기 때문에 가장 먼저 DFS로 푸는 방법을 떠올렸다
재귀를 돌면서 아직 방문하지 않았으면서 값이 1인 부분을 찾고, 재귀가 끝나면 return True를 해준다
반복문으로 dfs 함수를 호출해 true면 result를 증가해준다
import sys sys.setrecursionlimit(10000) def dfs(x, y): if x < 0 or x >= n or y < 0 or y >= m: return False if not visited[x][y] and ground[x][y] == 1: visited[x][y] = True for p in range(4): nx = x + dx[p] ny = y + dy[p] dfs(nx, ny) return True return False TC = int(input()) for t in range(TC): m, n, k = map(int, input().split()) ground = [[0] * m for _ in range(n)] visited = [[False] * m for _ in range(n)] dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] for i in range(k): a, b = map(int, input().split()) ground[b][a] = 1 result = 0 for i in range(m): for j in range(n): if dfs(j, i): result += 1 print(result)
2. BFS
BFS는 상하좌우를 확인하면서 아직 방문하지 않았고, 값이 1이면 큐에 넣어주고
큐에서 pop해가면서 확인하면 된다
넘 쉬운 문제
from collections import deque def bfs(x, y): queue = deque() queue.append((x, y)) visited[x][y] = True while queue: x, y = queue.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if nx < 0 or nx >= n or ny < 0 or ny >= m: continue if graph[nx][ny] == 1 and not visited[nx][ny]: queue.append((nx, ny)) visited[nx][ny] = True return True T = int(input()) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] for t in range(T): m, n, k = list(map(int, input().split())) graph = [[0 for _ in range(m)] for __ in range(n)] visited = [[False] * m for _ in range(n)] point = [] result = 0 for _ in range(k): a, b = map(int, input().split()) graph[b][a] = 1 point.append((b, a)) for p in point: a, b = p if not visited[a][b] and graph[a][b] == 1: bfs(a, b) result += 1 print(result)
참고로 검색 대상이 엄청 크지 않으면 단순 속도는 BFS가 더 빠르다

'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2579 - 계단 오르기 (Python) (1) | 2023.11.21 |
---|---|
[백준] 9095 - 1, 2, 3 더하기 (Python) (0) | 2023.11.21 |
[백준] 1463 - 1로 만들기 (Python) (1) | 2023.11.20 |
[백준`G5] 10026 - 적록색약 (Python) (0) | 2023.11.18 |
[백준] 1697 - 숨바꼭질 (Python) (2) | 2023.11.14 |