본문 바로가기
알고리즘 풀이/백준

[백준 3190] 뱀 (python)

by char_lie 2023. 3. 1.
반응형

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

 

3190번: 뱀

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

www.acmicpc.net

뱀 문제

사과 먹으면 뱀 길이 길어져가는 아나콘다같은 게임을 만들어 몇초 살아남는지 보는 문제

구현 문제 중 생각보다 복잡한 기능을 사용하지 않고 쉽게 해결 할 수 있는 문제

 

내가 푼 정답코드

# 값 받기
import sys
from collections import deque 
N = int(sys.stdin.readline())
board = [[0]*N for _ in range(N)]
K = int(sys.stdin.readline())
for _ in range(K):
    a, b = map(int, sys.stdin.readline().split())
    board[a-1][b-1]= 1
L = int(sys.stdin.readline())
move = [0]*L
for j in range(L):
    move[j] = list(sys.stdin.readline().split())
dy = [0,1,0,-1]
dx = [1,0,-1,0]
go, cnt = 0, 0 # 이동 방향 / 시간
y, x = 0, 0 # 현재 뱀 머리 위치
snake = deque([[0,0]]) # 뱀 전체 몸

while True : # 범위내에서 도는 동안
    cnt += 1 # 시간 + 1
    y, x = y + dy[go], x + dx[go] # go에 따른 이동
    if y < 0 or y >= N or x <0 or x >= N or [y,x] in snake : #만약 머리가 뱀 몸 안에 있으면
        break # 끝
    snake.append([y,x]) #뱀의 머리를 몸에 추가
    if board[y][x] == 0: # 사과를 먹지 않았다면
        snake.popleft() # 이동했으므로 꼬리 끝부분 이동
    if board[y][x] == 1: # #사과를 먹었으면
        board[y][x] = 0 # 없애주자
    
    for num, c in move : # 시간과 방향에 대해
        if cnt == int(num) and c == 'D': # 시간이 num초 흐르고 D라면
            go = (go+1)%4 # 시계방향으로 가!
        elif cnt == int(num) and c == 'L': #시간이 num초 흐르고 L이라면
            go = (go-1)%4 # 반시계방향으로 가!
print(cnt)

다른 문제와 달리 세세한 조건이 많지 않아서 구현하기 쉬웠던 문제

몇가지 조건만 구현하면 금방 해결 할 수 있었다.

1. 머리가 칸 밖으로 나가거나 자기 몸통이랑 마주치면 끝

2. 사과를 먹지 않았다면 머리를 따라 꼬리가 이동하는 구조 (queue의 구조)

3. 사과를 먹었다면 꼬리는 냅두고 머리만 이동한채로 사과를 없애주기

이 조건만 구현하면 된다.


느낀점

구현 문제를 연습하기 위해 선택한 문제로 사실 30분이면 충분히 해결해낼 수 있던 문제였으나, 이상하게 예제는 정상적으로 돌아가나 제출만하면 recursion error가 뜨는 기현상이 발생해서 뭐가 원인인지 찾는데만 1시간 넘게 소비를 해서 오래 걸린 문제.. 

재귀를 쓰지도 않았는데 자꾸 나와서 교수님께 물어보니 처음에 input =sys.stdin.readline 이라 하고 input을 받았어야하는데 반대로 sys.stdin.readline = input이라고 적어서 런타임 오류가 나버린것 (근데 예제는 왜돌아가...?)

그 외 부분은 구현하는데 큰 어려움이 없었고, 다음부턴 그냥 평소에 안하던짓 안하고 하던대로 해야겠단걸 느낀 문제였다..😥

반응형

댓글