💡 Codeing Test/백준

백준 3190) 뱀 (python)

밈98 2024. 2. 26. 09:20

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

 

3190번: 뱀

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

www.acmicpc.net

 

n = int(input())
k = int(input()) #사과개수
arr = [[0]*(n+1) for _ in range(n+1)]
for _ in range(k):
    x,y = map(int, input().split())
    arr[x][y] = 1
L = int(input())
info = []
for _ in range(L):
    X,C = map(str, input().split())
    info.append((int(X),C))

#동 남 서 북 (오른쪽 머리)
dx = [0,1,0,-1]
dy = [1,0,-1,0]

def turn(dir, c):
    if c == 'L':
        dir = (dir -1)%4
    else:
        dir = (dir+1)%4
    return dir


def simulate():
    x,y = 1,1
    dir = 0
    arr[x][y] = 2 #뱀의 머리가 있는곳
    time = 0
    idx = 0 #회전정보
    q = [(x,y)] #뱀의 몸통이 차지하고 있는 위치 정보(꼬리가 앞)
    while True:
        nx = x+ dx[dir]
        ny = y + dy[dir]
        # 맵안, 뱀위 몸통이 없는곳
        if 1<=nx and nx <=n and 1<=ny and ny<=n and arr[nx][ny]!=2:
            if arr[nx][ny] == 0:
                arr[nx][ny] = 2
                q.append((nx,ny))
                px,py = q.pop(0)
                arr[px][py] = 0
            if arr[nx][ny] == 1:
                arr[nx][ny] = 2
                q.append((nx,ny))
        else:
            time +=1
            break
        x,y = nx,ny
        time +=1
        if idx < L and time == info[idx][0]:
            dir = turn(dir, info[idx][1])
            idx += 1
    return time


print(simulate())

 

시뮬레이션 문제가 약해서 고민해보다 못 풀것같아서 이코테 답을 확인하고 풀었다

 

 => 이런 문제는 그림을 그려서 해결해야한다

 

내가 해결 못한 사고방향

 

1. 방향이 바뀌는 건 어떻게 표현하지??

 

처음에 머리가 우측으로 되어있고 돌아가는 것이기때문에

dx, dy 를 동쪽으로 코드를 작성한다

#동 남 서 북 (오른쪽 머리)
dx = [0,1,0,-1]
dy = [1,0,-1,0]

 

def turn 함수로 'L' 일 경우 왼쪽 회전

'D'일 경우 오른쪽 회전으로 

 

%4를 해줘서 4방향 안으로 계속 돌린다

def turn(dir, c):
    if c == 'L':
        dir = (dir -1)%4
    else:
        dir = (dir+1)%4
    return dir

 

2. 사과를 먹은 후 몸통이 늘어난 부분은 어떻게 구현하지??

코드에서는 list를 사용해서 풀었다.

q = [(x,y)]

처음 머리가 있는 부분이다. 사과를 먹고 나면 그대로 q.append[(사과먹은위치)]를 추가해준다.

사과가 없다면, 머리를 넣고 안에 있는 값을 빼준다.