IT/백준
[백준] 1012 유기농 배추(Python)
ziasu
2021. 10. 13. 11:43
반응형
1. 생각 정리
- 전체 map에서 배추가 심어져 있는 위치를 입력받고, 몇 개의 지렁이가 필요한지 구하는 문제
- 지렁이는 인접한 배추로 이동할 수 있기 때문에 연결되어있는 배추 지역에는 지렁이가 하나만 있어도 됨
- 결국 전체 map에 0(배추x), 1(배추 o)로 입력을 받고 섬처럼 생긴 1 지역이 몇 개인지? 구하는 접근을 가지면 됨
- DFS와 BFS 둘 다 활용하여 풀어보자
2. BFS 시간초과 코드
- 한번 탐색한 부분은 다시 탐색하지 않게 전체 map과 같은 크기인 visited 리스트를 따로 만들어서 정보를 관리했더니 시간 초과가 떴다.
#bfs 시간초과
from collections import deque
def bfs(start):
q=deque()
q.append(start)
dir = [(-1,0),(1,0),(0,-1),(0,1)]
while q:
x,y = q.popleft()
for dx, dy in dir:
nx, ny = x+dx, y+dy
if 0<=nx<n and 0<=ny<m and mapp[nx][ny] and mapp[nx][ny]==1:
mapp[nx][ny] = 2
q.append((nx, ny))
for _ in range(int(input())):
m,n,k = map(int, input().split())
mapp = [[0]*m for _ in range(n)]
for _ in range(k):
y,x = map(int, input().split())
mapp[x][y] = 1
result=0
for i in range(n):
for j in range(m):
if mapp[i][j]==1:
mapp[i][j]=2
bfs((i,j))
result+=1
print(result)
3. BFS 정답 코드
- 따로 visited 리스트를 만들지 않고
- mapp에서 (배추 없는 영역: 0), (배추 있는데 이미 탐색한 영역: 2), (배추 있는데 아직 탐색하지 않은 영역: 1) 이렇게 숫자를 바꿔가며 탐색 정보를 관리
from collections import deque
def bfs(start):
q=deque()
q.append(start)
dir = [(-1,0),(1,0),(0,-1),(0,1)]
while q:
x,y = q.popleft()
for dx, dy in dir:
nx, ny = x+dx, y+dy
if 0<=nx<n and 0<=ny<m and mapp[nx][ny] and mapp[nx][ny]==1:
mapp[nx][ny] = 2
q.append((nx, ny))
for _ in range(int(input())):
m,n,k = map(int, input().split())
mapp = [[0]*m for _ in range(n)]
for _ in range(k):
y,x = map(int, input().split())
mapp[x][y] = 1
result=0
for i in range(n):
for j in range(m):
if mapp[i][j]==1:
mapp[i][j]=2
bfs((i,j))
result+=1
print(result)
4. DFS 정답 코드
- 단, recursionlimit을 늘려주지 않으면 RecursionError 발생
#dfs
import sys
sys.setrecursionlimit(100000)#이거 설정 안해주면 RecursionError
def dfs(x,y):
visited[x][y] = True
dir = [(-1,0),(1,0),(0,-1),(0,1)]
for dx, dy in dir:
nx, ny = x+dx, y+dy
if 0<=nx<n and 0<=ny<m and mapp[nx][ny] and not visited[nx][ny]:
dfs(nx, ny)
for _ in range(int(input())):
m,n,k = map(int, input().split())
mapp = [[0]*m for _ in range(n)]
visited = [[False]*m for _ in range(n)]
for _ in range(k):
y,x = map(int, input().split())
mapp[x][y] = 1
result=0
for i in range(n):
for j in range(m):
if mapp[i][j] and not visited[i][j]:
dfs(i,j)
result+=1
print(result)
반응형