개발/algorithm

[백준 3190번] 뱀 - python

zzi_on2 2022. 2. 10. 17:14

문제 링크

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

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

풀이 

- bfs 문제 

- deque를 통해 뱀을 표현 

# bfs 문제 
from collections import deque 

# 오른쪽 아래쪽 왼쪽 위쪽 
dx = [ 0, 1, 0, -1 ]
dy = [ 1, 0, -1, 0]

def bfs():
  x, y = 1, 1 
  # 뱀이 있는 곳 2로 표현  
  graph[x][y] = 2
  # 방향 
  direction = 0 
  # 뱀의 몸 
  q = deque()
  q.append((x,y))
  
  # 시간 
  t = 0
  # 이동 경로 인덱스 
  index = 0 

  while True:
    nx = x + dx[direction]
    ny = y + dy[direction]

    # 범위에 있고 뱀의 몸이 아니면 
    if 1 <= nx <= n and 1 <= ny <= n and graph[nx][ny] != 2 :
      # 사과가 아니면 
      if graph[nx][ny] == 0 :
        # 뱀이 한칸 앞으로 이동 
        graph[nx][ny] = 2
        q.append((nx,ny))
        # 뱀의 몸 길이 줄이기 
        px, py = q.popleft()
        graph[px][py] = 0
      # 사과면 
      if graph[nx][ny] == 1 :
        # 뱀이 한칸 앞으로 이동 
        graph[nx][ny] = 2
        q.append((nx,ny))
    else :
      t += 1
      break
    
    x = nx
    y = ny 
    t += 1
    # 시간이 되면 회전 
    if index <len(data) and t == data[index][0]:
      direction = turn(direction, data[index][1])
      index += 1 

  return t

# 회전 
def turn(direction, c):
  if c == 'L':
    direction = (direction -1)%4
  else:
    direction = (direction +1)%4

  return direction 

# 보드의 크기 
n = int(input())

# 사과의 개수
k = int(input())

graph = [[0] * (n+1) for _ in range(n+1)]

for _ in range(k):
  a, b = map(int,input().split())
  graph[a][b] = 1

data = []
# 뱀의 방향 변환 횟수 
l = int(input())

for _ in range(l):
  x, c = input().split()
  data.append((int(x), c))

print(bfs())