카테고리 없음

[백준 3190] 뱀

🥭맹2 2021. 4. 16. 02:26

1. 문제

www.acmicpc.net/problem/3190

 

3190번: 뱀

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

www.acmicpc.net

2. 접근 방법

일단은 deque를 사용해서 구현했습니다.

 

사용한 함수는 move, isEnd, rotate가 있습니다.

move: 뱀을 이동시키는 함수

isEnd: 뱀이 board 영역을 벗어났을 때 혹은 자기 자신의 몸에 머리를 댔을 때

rotate: 회전할 때

 

1. 초기 위치인 (1, 1) -> board 기준 (0, 0)을 먼저 deque에 넣고 move함수를 실행

2. 일단 현재 회전해야하는지 확인

2-1. 회전해야한다면 rotate함수를 이용해 방향 바꿔주기

3. 이동할 곳(머리가 향하고 잇는 곳)은 갈 수 있는 곳인지 isEnd 함수를 이용해 확인

3-1. 갈 수 있다면 사과가 있는 곳인지 확인

3-1-1. 사과가 있는 곳이라면, 뱀의 머리만 늘리기(꼬리 자르기 ㄴㄴ)

3-1-2. 사과가 없는 곳이라면, 뱀의 머리는 늘리고, 꼬리는 자르기

3-2. 갈 수 없다면 return

3. 코드

python

from collections import deque

def isEnd(x, y):
    global board
    if x < 0 or x >= N or y < 0 or y >= N:
        return True
    elif board[y][x] == True and board[y][x] != 'apple':
        return True
    return False

def move():
    global ans, now_dir
    while q:
        x, y = q[0]

        if bam_dirs and ans == int(bam_dirs[0][0]):
            now_dir = rotate(now_dir, bam_dirs[0][1])
            bam_dirs.pop(0)

        tx = x + dirs[now_dir][0]
        ty = y + dirs[now_dir][1]

        if not isEnd(tx, ty):
            if board[ty][tx] != 'apple':
                x, y = q.pop()
                board[y][x] = False
            q.appendleft((tx, ty))
            board[ty][tx] = True
        else:
            return
        ans += 1


def rotate(now_dir, direction):
    if direction == "D":
        return (now_dir + 1) % 4
    elif direction == 'L':
        return (now_dir-1) % 4


N = int(input())
K = int(input())
board = [[False]*N for _ in range(N)]
apples = [list(map(int, input().split())) for _ in range(K)]
for i in range(len(apples)):
    ay = apples[i][0] - 1
    ax = apples[i][1] - 1
    board[ay][ax] = 'apple'

L = int(input())
bam_dirs = [list(map(str, input().split())) for _ in range(L)]
dirs = [(1, 0), (0, 1), (-1, 0), (0, -1)]
now_dir = 0
ans = 0

q = deque()
q.append((0, 0))
board[0][0] = True

move()
print(ans+1)

4. 마치며

몇 안되는 예전에 풀었던 문제 중 하나인데, 다 풀고 나서 예전에 짠 코드 보니까 이때는 함수로 안나누고 통으로 풀었네여

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

흠 ~!

더보기

예전 코드 보기

import sys

def isWall(x, y):
    global now_snake
    if x <= 0 or x > N or y <= 0 or y > N:
        return False
    elif [x, y] in now_snake:
        return False
    return True

N = int(sys.stdin.readline())
apple_lst = [list(map(int, sys.stdin.readline().split())) for i in range(int(sys.stdin.readline()))]
snake_dir = [list(sys.stdin.readline().split()) for i in range(int(sys.stdin.readline()))]
board = [[0] * (N+1) for _ in range(N+1)]
dir_lst = [[1, 0], [0, 1], [-1, 0], [0, -1]]

now_dir = 0
now_snake = [[1, 1]]
cnt = 0

while True:
    if len(snake_dir) and int(snake_dir[0][0]) == cnt:
        change_dir = snake_dir.pop(0)
        if change_dir[1] == 'L':
            now_dir = (now_dir + 3) % 4
        else:
            now_dir = (now_dir + 1) % 4
    test_x = now_snake[-1][0] + dir_lst[now_dir][0]
    test_y = now_snake[-1][1] + dir_lst[now_dir][1]
    if isWall(test_x, test_y):
        if not [test_y, test_x] in apple_lst:
            now_snake.pop(0)
        else:
            apple_lst.remove([test_y, test_x])
        now_snake.append([test_x, test_y])
        cnt += 1
    else:
        print(cnt+1)
        break

 

예전에도 사과 좌표 때문에 고생했던거 같은데, 이번에도 좌표가 (행, 열)이라는 걸 까먹고 (x, y)로 생각했다가 삽질좀 했슴다 ^-^