Python/백준

3190_뱀

728x90

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

 

3190번: 뱀

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

www.acmicpc.net

 

 

뱀이 사과를 먹고 길어져서 벽에 부딪히거나 하면 끝나는 게임이다. 다들 한번쯤 해본 적 있을 것이다.

 

  • 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
  • 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
  • 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.

문제에서 해당 멘트를 제공해 주는데 정말 코드로 구현하기 쉽게 힌트를 준셈과 같다. 위 말을 그대로 구현하기만 하면 된다.

 

다만 헷갈릴만한 점이 여러가지가 있다.

 

1. 뱀의 동선이 절대적 시간으로 주어진다는거 (게임이 시작하고 8초 D ,10초 D라면 실제로는 8초직진후 우회전, 2초 추가로 더 직진후 우회전이란 말)

2. 행,열이 0이 아닌 1부터 시작 ( 필자같은경우 n*n판으로 만들어서 1행 1열에 넣어야하는 값이면 0행 0열에 넣어야 했다.)

 

 

문제케이스에서 최대 10000번이라고 주었기에 10000번을 반복하도록 하면서 뱀을 큐에 넣고 빼면서 구현하였다. 즉 큐 안에 뱀의 머리 - 꼬리로 이어지는 좌표들을 넣고 관리하였다.

 

방향은 dx,dy 를 사용해서 D를 만나면 우회전, L을 만나면 좌회전이 되도록 구현하였다.

 

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

dx = [1,0,-1,0]
dy = [0,1,0,-1]

n = int(input())
k = int(input())
board = [ [0]*n for _ in range(n) ]

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

l = int(input())
dic = {}
for _ in range(l):
    a,b = map(str,input().split())
    dic[int(a)] = b

board[0][0] = 1
snail = deque([[0,0]])
To = 0


for i in range(1,10000):

    y,x = snail[0]
    nx,ny = x + dx[To], y + dy[To]

    if 0<=nx<n and 0<= ny < n:
        if board[ny][nx] == 1:
            print(i)
            break
        elif board[ny][nx] == -1:
            board[ny][nx] = 1
            snail.appendleft([ny,nx])
        else:
            snail.appendleft([ny,nx])
            board[ny][nx] = 1
            a,b = snail.pop()
            board[a][b] = 0
    else:
        print(i)
        break

    if i in dic:
        if dic[i] =='D':
            To = (To+1)%4
        else:
            To = (To-1)%4



728x90

'Python > 백준' 카테고리의 다른 글

14502_연구소  (0) 2022.06.26
14499_주사위굴리기  (0) 2022.06.24
12100_2048(easy)  (0) 2022.06.19
13460_구슬탈출 2  (0) 2022.06.18
14501_퇴사  (0) 2022.06.17