[3190] 뱀 (골드 5)

isanghaessi·2022년 2월 2일
0

백준

목록 보기
3/10

3190번: 뱀

뱀이 사과를 먹으면서 움직이는 게임에서, 방향 전환 타이밍을 주고 결과를 예측하는 문제이다.

고려했던 사항은 다음과 같다.

  • 방향을 바꿀 경우, 뱀은 이동 후에 방향을 바꾼다.
    • 문제를 자세히 읽어야 알 수 있는 정보다. 처음에는 바로 방향을 바꾸는 것으로 했다가 꽤나 헤맸다...
  • 뱀이 자신의 몸이나 벽과 부딪히면 게임이 끝난다.

풀이 과정은 다음과 같다.

  • 사과 정보를 담은 board를 2차원 배열로 만든다.
  • 시간초를 1초씩 지나면서 move함수를 통해서 뱀이 움직인다.
    • di, dj를 통해서 방향 정보를 가지고, 활용한다.
    • 오른쪽, 왼쪽으로 방향을 틀 경우를 모두 가지고 있는 딕셔너리를 만들어놓고 활용한다.
  • 뱀의 자취(몸)을 배열로 저장, 활용한다.

문제를 제대로 해석하지 못해서 오래 걸리고 힘들었다... 방향 전환, 사과의 위치(인덱스와 혼용), 시간초(0초부터 시작 VS 1초부터 시작)과 같이 문제를 오래 보고 읽어야 풀 수 있었다. 실제로 테스트에서 나왔다면 뼈대만 만들고 디버깅하면서 시간을 많이 허비할게 뻔하다. 문제를 제대로 읽는 연습을 해야겠다.

import sys
import collections
import pprint

def move():
  global snake, di, dj

  head, tail = snake[-1], snake[0]
  nhi = head[0] + di
  nhj = head[1] + dj
  if nhi < 0 or nhi >= n or nhj < 0 or nhj >= n or (nhi, nhj) in list(snake)[:-1]:

    return False
  snake.append((nhi, nhj))
  isApple = False
  if board[nhi][nhj] == 1:
    isApple = True
  board[nhi][nhj] = -1
  if not isApple:
    board[tail[0]][tail[1]] = 0
    snake.popleft()

  return True

n = int(sys.stdin.readline().strip())
k = int(sys.stdin.readline().strip())
board = [[0 for _ in range(n)] for _ in range(n)]
for _ in range(k):
  i, j = map(int, sys.stdin.readline().strip().split(' '))
  board[i - 1][j - 1] = 1
l = int(sys.stdin.readline().strip())
rotates = collections.deque([])
for _ in range(l):
  time, direction = sys.stdin.readline().strip().split(' ')
  rotates.append((int(time), direction))
board[0][0] = -1
ds = {(0, 1): {'di': 0, 'dj': 1, 'L': (-1, 0),  'D': (1, 0)}, (1, 0): {'di': 1, 'dj': 0, 'L': (0, 1), 'D': (0, -1)}, (0, -1): {'di': 0, 'dj': -1, 'L': (1, 0),  'D': (-1, 0)}, (-1, 0): {'di': -1, 'dj': 0, 'L': (0, -1),  'D': (0, 1)}}
di = 0
dj = 1
snake = collections.deque([(0, 0)])
time = 0
while True:
  time += 1
  if not move():
    print(time)

    break
  if len(rotates) > 0 and rotates[0][0] == time:
    _, direction = rotates.popleft()
    current = (di, dj)
    di = ds[ds[current][direction]]['di']
    dj = ds[ds[current][direction]]['dj']
profile
seungyong HONG

0개의 댓글