본문 바로가기
ALGORITHM/이코테

[ALGORITHM] 5. DFS/BFS

by 뭉망뭉 2022. 3. 1.

이것이 취업을 위한 코딩테스트다 python 문제 풀이

5-10. 음료수 얼려 먹기

#C5. DFS/BFS - 실전문제 '음료수 얼려 먹기'

import sys
put = sys.stdin.readline
n, m = map(int, put().split())
shape = []
for i in range(n):
    shape.append(list(map(int, put())))

def dfs(x, y):
    #범위 넘어가면 끝냄
    if x<=-1 or x>=n or y<=-1 or y>=m:
        return False    
    if shape[x][y] == 0:  
        #방문 처리      
        shape[x][y] = 1
        #상좌우하 재귀적 호출
        dfs(x-1, y)
        dfs(x, y-1)
        dfs(x+1, y)
        dfs(x, y+1)
        return True
    return False

# 모든 노드(위치)에 대해 음료수 채우기
result=0
for i in range(n):
    for j in range(m):
                # 현재 위치에서 DFS 수행
        if dfs(i,j) == True:
            result += 1

print(result)

 

5-11. 미로 탈출

#C5. DFS/BFS - 실전문제 '미로 탈출'

import sys
from collections import deque
put = sys.stdin.readline
n, m = map(int, put().split())
maze = []
for i in range(n):
    maze.append(list(map(int, put())))
dx = [0, -1, 1, 0] #상좌우하 #x y 안 나누면 대각선 방향으로 더해져서 dx dy 나눠야
dy = [1, 0, 0, -1] 

def bfs(x,y):
    queue = deque()
    queue.append((x,y))
    # 큐가 빌 때까지 반복
    while queue:
        # 큐에서 원소 하나 뽑음
        x, y = queue.popleft()
        # 네 방향으로 이동
        for i in range(4):
            a = x+dx[i]
            b = y+dy[i]
            # 영역 벗어나면 무시
            if a<0 or a>=n or b<0 or b>=m:
                continue
            # 괴물 있으면 무시
            if maze[a][b] == 0:
                continue
            # 해당 노드를 처음 방문하면 기록
            if maze[a][b] == 1:
                maze[a][b] = maze[x][y] + 1 #기존 거에 더해야함
                queue.append((a,b))
        # 가장 오른쪽 아래까지의 최단 거리 반환
    return maze[n-1][m-1] #(0,0)이 문제 상 (1,1)로 인식되니까 (n-1,m-1)이어야 문제 상 (n,m)

print(bfs(0,0))

'ALGORITHM > 이코테' 카테고리의 다른 글

[ALGORITHM] 8. 다이나믹 프로그래밍  (0) 2022.03.06
[ALGORITHM] 7. 이진 탐색  (0) 2022.03.05
[ALGORITHM] 6. 정렬  (0) 2022.03.04
[ALGORITHM] 4. 구현  (0) 2022.02.28
[ALGORITHM] 3. 그리디  (0) 2022.02.27

댓글