현제의 현재이야기

[0208 TIL]HUFS 겨울방학 코테대비 캠프(dfs, bfs) 본문

algorithm/HUFS 2023 -1 겨울 코테대비캠프

[0208 TIL]HUFS 겨울방학 코테대비 캠프(dfs, bfs)

현재의 현제 2023. 2. 8. 12:50

DFS, BFS에 대한 고찰

드디어 깨우쳐 버린 그래프 탐색. 재귀 함수에 대한 것을 이해하고 보니 dfs가 쉬워졌다. 리스트로 푸는 문제는 전에 이해가 가능했었는데 그래프에서는 어려움을 겪었었다. 근데 알아버림

 

두, 네 방향 탈출 가능 여부 판별 DFS와 BFS차이

| 문제

n * m 크기의 이차원 영역의 좌측 상단에서 출발하여 우측 하단까지 뱀에게 물리지 않고 탈출하려고 합니다. 이동을 할 때에는 반드시 상, 우에 인접한 칸으로만 이동할 수 있으며, 뱀이 있는 칸으로는 이동을 할 수 없습니다. 예를 들어 <그림 1>과 같이 뱀이 배치 되어 있는 경우 실선과 같은 경로로 탈출을 할 수 있습니다. 이 때 뱀에게 물리지 않고 탈출 가능한 경로가 있는지 여부를 판별하는 코드를 작성해보세요.

DFS(두방향)

n , m = tuple(map(int, input().split()))
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

visited = [
    [0 for _ in range(m)]
    for _ in range(n)
]

def in_range(x, y):
    return 0 <= x < n and 0 <= y < m

def can_go(x, y):
    if not in_range(x, y):
        return False
    
    if visited[x][y] == 1 or grid[x][y] == 0:
        return False
    
    return True

dxs, dys = [0, 1], [1, 0]

def dfs(x, y):
    for dx, dy in zip(dxs, dys):
        nx, ny = x + dx, y + dy
        
        if can_go(nx, ny):
            visited[nx][ny] = 1
            dfs(nx, ny)
        

visited[0][0] = 1
dfs(0, 0)

print(visited[n - 1][m - 1])
  • 처음에 visit에 처음 점을 넣고, 방문했다는 것을 체크한다.
  • 그리고 dfs로 접근
  • dx, dy로 검사해주고 다음 칸이 갈 수 있을 때, visited를 1로해주고 다시 dfs로 들어간다.

BFS(네 방향)

from collections import deque

n, m = tuple(map(int, input().split()))
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

visited = [
    [0 for _ in range(m)]
    for _ in range(n)
]
def in_range(x, y):
    return 0 <= x < n and 0 <= y <m

def can_go(x, y):
    if not in_range(x, y):
        return False
    
    if grid[x][y] == 0 or visited[x][y]:
        return False
    
    return True

q = deque()

dxs, dys = [1, -1, 0, 0], [0, 0, -1, 1]

def bfs():
    while q:
        x, y = q.popleft()
        for dx, dy in zip(dxs, dys):
            nx, ny = x + dx, y + dy
            if can_go(nx, ny):
                q.append((nx, ny))
                visited[nx][ny] = 1
                         
q.append((0, 0))
visited[0][0] = 1
bfs()
print(visited[n - 1][m - 1])

 

  • bfs는 처음 0, 0을 q에 넣고, 방문했다는 것을 체크한 뒤, bfs에 들어간다.
  • q가 다 빌 때까지 큐에서 다음 대상인 x, y를 pop해주고
  • dx, dy로 nx, ny를 뱉고, 갈 수 있는지 검사.
  • 갈 수 있으면 q에 넣어두고 visited 체크

다른 문제들도 풀어보면서 더 익혀야겠다.

 

 

Comments