풀이


시뮬레이션을 통한 뱀게임 문제이다.

문제에서 주어진 중요한 구현사항은

  1. 시간이 지날때마다 뱀이 한칸씩 움직인다.

  2. 사과를 먹을 경우 뱀의 길이가 1칸 증가한다.

  3. 주어진 시간마다 방향전환을 하는 변수가 있다.

뱀게임을 진행 할 N x N 보드를 준비하고 0, 0 에 뱀을 위치시킨다.

뱀의 default 방향은 우측이다.

주어진 사과 정보를 통해 N x N 보드에 사과를 배치한다.

시간이 최대 10,000초로 한정되어있으니 주어진 방향전환순간을 인덱싱하여 회전방향을 저장한다.

게임이 시작됐다.

시간이 흐르고 뱀의 위치가 변경된다.

이때 조건문을 통해 뱀이 보드 밖으로 가거나 자기자신을 지나게 될 경우를 제외하고,

뱀이 사과를 먹지않는 경우만을 사용해 뱀의 꼬리를 제거해주면된다.

또한 방향전환순간일 경우 미리 선언해둔 direction 함수를 통해 다음 순환에서 전환된 방향으로 뱀이 이동하게끔 조건문을 선언한다.

뱀이 보드 밖으로 가거나 자기자신을 지나게 될 경우 while문을 탈출하고 게임시작 후 흐른 시간을 출력한다.

소스코드


import sys
 
input = sys.stdin.readline
# 0 : empty
# 1 : apple
# 2 : snake
 
# 방향전환
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
 
 
def direction(c, d):
    if c == "L":
        d = (d - 1) % 4
    else:
        d = (d + 1) % 4
    return d
 
 
N = int(input())
K = int(input())
board = [[0] * N for _ in range(N)]
 
# 사과 배치
for _ in range(K):
    x, y = map(int, input().split())
    board[x - 1][y - 1] = 1
 
L = int(input())
dirc = [0 for _ in range(10000)]
 
# 방향전환순간
for i in range(L):
    X, C = input().split()
    dirc[int(X)] = C
 
t, x, y, d = 0, 0, 0, 0
board[x][y] = 2  # initial position
snake_len = [[x, y]]  # 뱀의 길이
 
while True:
    t += 1
 
    # 다음 뱀머리가 위치 할 좌표
    x = x + dx[d]
    y = y + dy[d]
 
    if 0 <= x < N and 0 <= y < N and board[x][y] != 2:
        if board[x][y] == 0:  # 뱀이 사과를 먹지않는 경우
            nx, ny = snake_len.pop(0)  # 꼬리 좌표 추출
            board[nx][ny] = 0  # 꼬리 제거
        board[x][y] = 2  # 뱀 좌표 수정
        snake_len.append([x, y])  # 뱀 길이 수정
        if dirc[t] != 0:  # 방향전환순간일 경우
            d = direction(dirc[t], d)
    else:
        print(t)
        break

References