본문 바로가기

취준/백준

[백준][Python][3190][브루트포스] 뱀

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

 

3190번: 뱀

문제  'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따

www.acmicpc.net

최적화와 기타등등 아무것도 신경안쓴 누더기 코드를 보는 당신! 축하드립니다.

잘난 코드는 다들 비슷하지만 못난 코드는 개성있게 못났다는 사실을 기억하십시오

 

뱀 문제는 문제를 그대로 구현하면 된다.

 

나는 dictionary를 잘 쓰니까 요번에도 사과 + 위치변경 확인용으로 썼다.

 

신경써야 할 곳은 다음과 같다.

  1. 벽에 부딪히면 끝
  2. 자기 몸에 부딪히면 끝
  3. 사과 다먹는다고 끝 아님 

몸은 Deque를 써 pop,appendleft로 길이조절 하기가 쉬워졌다.

사실 저 numapple은 안써도 된다. 3번 조건을 멋대로 만들어버렸다.

 

나머지 코드는 보면 이해할만 하니 패스.

 

import sys
from collections import deque

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

def changedir(c,v):
    if c=="L":
        return (v+3)%4
    elif c=="D":
        return (v+1)%4
    else:
        return v

apple = dict()
movement = dict()
n = int(input())
k = int(input())
numapple = k
ret = 1
for a in range(k):
    apple[tuple([int(i)-1 for i in sys.stdin.readline().rstrip().split()])] = True

l = int(input())
for a in range(l):
    k,v = [i for i in sys.stdin.readline().rstrip().split()]
    movement[int(k)] = v


q = deque()
q.append((0,0))
vector = 0
while True:


    

    if (q[0][0]+dy[vector],q[0][1]+dx[vector]) in q:
        print(ret)
        sys.exit()
    else:
        q.appendleft((q[0][0]+dy[vector],q[0][1]+dx[vector]))


    if q[0] in apple:
        if apple[q[0]]:
            apple[q[0]] = False
            numapple-=1
        else:
            q.pop()
    else:
        q.pop()

    if ret in movement:
        if movement[ret] =="L" or movement[ret] =="D":
            vector = changedir( movement[ret] ,vector)
            movement[ret] = "0"


    if q[0][0]>=n or q[0][0]<0 or q[0][1]>=n or q[0][1]<0 :
        print(ret)
        sys.exit()
    else:
        ret+=1