[Python] 백준 3190 뱀

이민우·2023년 12월 21일
1

알고리즘

목록 보기
19/26

3190 문제 보러가기


문제는 이러하다

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

⭐️ 문제 해결

3190 문제 중점 사항

  • 뱀의 좌표를 가지고 있는 deque()를 만든다
  • 뱀은 몸길이를 늘릴 때 , 머리를 다음칸에 위치하는것이므로 움직인 칸의 좌표를 dq.appendleft()를 해준다.
  • 그리고 움직인 칸에 사과가 없다면, 몸길이를 줄이기 위해 꼬리가 위치한 칸을 비움으로 dq.pop()을 시켜 맨 뒤에 있는 좌표를 pop시켜준다
  • 문자 c가 'L'일때는 반시계 방향으로 회전, 'R'일떄는 시계 방향으로 회전함으로
     dx=[-1,0,1,0]
     dy=[0,1,0,-1]
     d=1 #맨 처음 시작은 오른쪽을 향함 dx[1],dy[1] -> (0,1)
     if rotate[0][1]=='L':
                d=(d+3)%4
            else:
                d=(d+1)%4
            rotate.pop(0)
    이렇게 회전 방향을 업데이트 해주는 것이 중요한 것 같다!

전체 코드

import sys
input=sys.stdin.readline
from collections import deque
n=int(input())
k=int(input())
board=[[0]*n for _ in range(n)]
for i in range(k):
    a,b=map(int, input().split())
    board[a-1][b-1]=1
L=int(input())
rotate=[]
res=0
dx=[-1,0,1,0]
dy=[0,1,0,-1]
d=1
for i in range(L):
    x,c=input().rstrip().split()
    rotate.append((x,c))
snake=deque()
snake.append((0,0))
while True:
    
    if len(rotate)!=0 and int(rotate[0][0])==res:
        if rotate[0][1]=='L':
            d=(d+3)%4
        else:
            d=(d+1)%4
        rotate.pop(0)
    res+=1
    x,y=snake[0][0], snake[0][1]
    xx, yy=x+dx[d], y+dy[d]
    if xx<0 or yy<0 or xx>=n or yy>=n or (xx,yy) in snake:
        print(res)
        sys.exit()
    elif 0<=xx<n and 0<=yy<n and board[xx][yy]==1 :
        board[xx][yy]=0
        snake.appendleft((xx,yy))
    elif 0<=xx<n and 0<=yy<n and board[xx][yy]==0 :
        snake.appendleft((xx,yy))
        snake.pop()
    
    
profile
백엔드 공부중입니다!

0개의 댓글