[ BOJ / Python ] 3190번 뱀

황승환·2022년 4월 14일
0

Python

목록 보기
265/498


이번 문제는 삼성 기출 문제로, 큐를 사용하여 쉽게 해결하였다. 문제에서 주어진대로 다음 위치 인덱스를 범위에 들어갈 경우에 구하고, 해당 인덱스가 뱀의 인덱스를 나타내는 tail 큐에 들어있을 경우 result+1을 반환하고, 그렇지 않다면 다음 위치를 tail에 넣어준다. 만약 그 위치에 사과가 있을 경우, 넘어가고, 사과가 있지 않을 경우, tail을 leftpop()해준다. 사과는 먹었으므로, 격자 상에서의 사과를 없애준다. 이 과정을 반복하다가 다음 위치가 범위 밖일 경우 result+1을 반환한다.

  • n을 입력받는다.
  • k를 입력받는다.
  • grid를 n*n의 크기의 리스트로 선언하고 0으로 채워준다.
  • k번 반복하는 for문을 돌린다.
    -> r, c를 입력받고, grid[r-1][c-1]을 2로 갱신한다.
  • l을 입력받는다.
  • command를 입력받는다.
  • command를 뒤에서부터 순회하며 현재의 command의 0번 인덱스에서 이전 command의 0번 인덱스를 빼준다.
  • command에 [sys.maxsize, '']을 넣어준다.
  • dy, dx를 우하좌상 순으로 저장한다.
  • move 함수를 y, x, d를 인자로 갖도록 선언한다.
    -> result를 0으로 선언한다.
    -> 뱀의 위치를 담을 큐 tail을 deque()로 선언한다.
    -> tail에 (y, x)를 넣는다.
    -> command를 순회하는 com에 대한 for문을 돌린다.
    --> 1부터 com[0]까지 반복하는 i에 대한 for문을 돌린다.
    ---> ny, nx를 tail[-1][0]+dy[d], tail[-1][1]+dx[d]로 선언한다.
    ---> 만약 ny, nx가 0 이상, n 미만일 경우,
    ----> 만약 (ny, nx)가 tail에 존재할 경우,
    -----> result+1을 반환한다.
    ----> tail에 (ny, nx)를 넣는다.
    ----> 만약 grid[ny][nx]가 2가 아닐 경우,
    -----> tail을 popleft()한다.
    ----> 그 외의 경우,
    -----> grid[ny][nx]를 0으로 갱신한다.
    ----> result를 1 증가시킨다.
    ---> 그 외의 경우,
    ----> result+1을 반환한다.
    --> 만약 com[1]이 L일 경우,
    ---> d를 (d+3)%4로 갱신한다.
    --> 만약 com[1]이 D일 경우,
    ----> d를 (d+1)%4로 갱신한다.
    -> result+1을 반환한다.
  • answer를 move(0, 0, 0)의 반환값으로 선언한다.
  • answer를 출력한다.

Code

import collections
import sys

n=int(input())
k=int(input())
grid=[[0 for _ in range(n)] for _ in range(n)]
for _ in range(k):
    r, c=map(int, input().split())
    grid[r-1][c-1]=2
l=int(input())
command=[list(map(str, input().split())) for _ in range(l)]
for i in range(l-1, 0, -1):
    command[i][0]=int(command[i][0])-int(command[i-1][0])
command.append([sys.maxsize, ''])
dy, dx=[0, 1, 0, -1], [1, 0, -1, 0]
def move(y, x, d):
    result=0
    tail=collections.deque()
    tail.append((y, x))
    for com in command:
        for i in range(1, int(com[0])+1):
            ny, nx=tail[-1][0]+dy[d], tail[-1][1]+dx[d]
            if 0<=ny<n and 0<=nx<n:
                if (ny, nx) in tail:
                    return result+1
                tail.append((ny, nx))
                if grid[ny][nx]!=2:
                    tail.popleft()
                else:
                    grid[ny][nx]=0
                result+=1
            else:
                return result+1
        if com[1]=='L':
            d=(d+3)%4
        elif com[1]=='D':
            d=(d+1)%4
    return result+1
answer=move(0, 0, 0)
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글