Algorithm/백준

[백준 알고리즘] 1584번: 게임 (Python, 0-1 BFS)

에릭 Kim 2023. 11. 14. 12:47
반응형

https://www.acmicpc.net/problem/1584

 

1584번: 게임

첫째 줄에 위험한 구역의 수 N이 주어진다. 다음 줄부터 N개의 줄에는 X1 Y1 X2 Y2와 같은 형식으로 위험한 구역의 정보가 주어진다. (X1, Y1)은 위험한 구역의 한 모서리이고, (X2, Y2)는 위험한 구역의

www.acmicpc.net

 

소스코드

import sys
from collections import deque
input = sys.stdin.readline

nx = [-1,0,1,0]
ny = [0,1,0,-1]

def BFS(a,b):
  dq = deque()
  dq.append([a,b,0])
  visited[a][b] = True

  while dq:
    x,y,life = dq.popleft()

    if x == 500 and y == 500: # 세준이가 (500,500)에 도달 가능하면
      return life # 잃는 생명 출력
      
    for i in range(4): # 상하좌우 탐색
      xx = x + nx[i]
      yy = y + ny[i]

      if (0 <= xx < 501) and (0 <= yy < 501): # 좌표가 범위 안에 있으면서 
        if not visited[xx][yy] and graph[xx][yy] != 2: # 방문하지 않았고, 죽음의 구역이 아닌 경우
          if graph[xx][yy] == 1: # 위험한 구역이면 생명 1 감소
            dq.append([xx,yy,life+1]) # 0-1 BFS 
          else:
            dq.appendleft([xx,yy,life]) # 0-1 BFS
          visited[xx][yy] = True

  return -1 # 도달하지 못하면 -1 출력

graph = [[0 for _ in range(501)] for _ in range(501)] # 안전구역으로 초기화 된 그래프
visited = [[False for _ in range(501)] for _ in range(501)]  

n = int(input())
for _ in range(n): # 위험한 구역을 그래프에 1로 표시
  x1,y1,x2,y2 = map(int,input().split())
  for i in range(min(x1,x2),max(x1,x2)+1):
    for j in range(min(y1,y2),max(y1,y2)+1):
      graph[i][j] = 1

m = int(input())
for _ in range(m): # 죽음의 구역을 그래프에 2로 표시 
  x1,y1,x2,y2 = map(int,input().split())
  for i in range(min(x1,x2),max(x1,x2)+1):
    for j in range(min(y1,y2),max(y1,y2)+1):
      graph[i][j] = 2

print(BFS(0,0))

 

 

풀이

★ 다익스트라 알고리즘을 연습하기 위해 찾은 문제인데, 가중치가 0과 1로 이루어져 있는 문제이기에 0-1 BFS로 풀었습니다 ! 

 

★ 0-1 BFS는 일반 BFS와 거의 유사한데, 가중치가 0인 좌표를 먼저 방문하기 위해 appendleft() 함수를 통해 큐의 앞쪽에 추가해주고, 가중치가 1인 좌표는 append() 함수로 뒤에 넣어줍니다. 

 

 

반응형