No Rules Rules

뱀 (feat. 백준, 3190번) 본문

생활/코테

뱀 (feat. 백준, 3190번)

개발하는 완두콩 2022. 7. 23. 20:55
728x90
반응형


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

 

3190번: 뱀

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

www.acmicpc.net

반응형
from collections import deque

def turn_direction(direction, where):
  if where == 'L':    # 현재에서 왼쪽
    direction -= 1
    if direction == -1:
      direction = 3
  elif where == 'D':  # 현재에서 오른쪽
    direction += 1
    if direction == 4:
      direction = 0
  return direction

N = int(input())
arr = [[0] * (N + 1) for _ in range(N + 1)]
K = int(input())
for _ in range(K):
  x, y = map(int, input().split())
  arr[x][y] = 1
L = int(input())
tmp = []
for _ in range(L):
  x, y = map(str, input().split())
  x = int(x)
  tmp.append([x, y])
POINT = dict()
for idx in range(len(tmp)):
  POINT[tmp[idx][0]] = tmp[idx][1]
  
direction = 1    # 0,1,2,3  북,동,남,서
# 북 동 남 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

time_count = 0
q = deque()
# 뱀의 시작점
x, y = 1, 1
arr[x][y] = 2
q.append([x, y])

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

  if 1<= x <= N and 1 <= y <= N and arr[x][y] != 2:
    # 뱀 머리의 위치를 보관하고 해당 위치 값을 2로 변경
    q.append([x,y])
    arr[x][y] = 2
    # 사과가 없으면 꼬리 부분 pop하고 해당 위치 값을 0으로 변경
    if arr[x][y] == 0:
      sx, sy = q.popleft()
      arr[sx][sy] = 0
  else:
    time_count += 1
    break;
  
  time_count += 1
  # 방향 회전해야 하는 경우
  if time_count in POINT:
    direction = turn_direction(direction, POINT[time_count])
    
print(time_count)

테두리에 대한 인덱싱만 고려한다면, 생각보다 쉬운 문제!

사과를 먹었거나 안먹었거나, 현재 뱀이 있는 x,y를 표시해주면 보다 간단하게 해결이 가능합니다.

728x90
반응형
Comments