Algorithm (PS)

[백준] 3190번: 뱀 (파이썬/Python) - 시뮬레이션, 구현

minjiwoo 2022. 12. 27. 14:35
728x90

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

 

3190번: 뱀

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

www.acmicpc.net

 

구현을 열심히 해주면 되는 문제~~

뱀의 위치표현을 정확하게 하는 방법이 관건이라 생각한다. 
사과를 먹으면 뱀의 현재까지 위치는 그대로 + 사과가 있던 위치(= 새로 이동한 칸)를 append 해준다. 

칸에 사과가 없는 경우 뱀은 꼬리좌표를 pop 시키고, 새로 이동한 칸을 append해준다. 

+ 그리고 rotate할 때  꿀팁 
-1 %4 == 3 이다. 
마이너스도 % 연산을 할 수 있다..!! 굉장히 간편하다 



n = int(input())
k = int(input())

graph = [[0] * n for _ in range(n)]

d = 0 # 0 : D, 1: L
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]

for _ in range(k):
    r, c = map(int, input().split())
    graph[r-1][c-1] = 2 # 사과

l = int(input()) # 방향 변환 횟수
turn_info = []
for _ in range(l):
    t, c = input().split()
    turn_info.append((int(t), c))

def rotate(c):
    global d
    if c == 'D':  # right
        d = (d + 1) % 4
    else:  # left
        d = (d - 1) % 4
count = 0
turn_index = 0
sx, sy = 0, 0 # snake head 좌표
graph[0][0] = 1 # 뱀
snake = [] #  뱀 좌표
snake.append((0, 0))

while True:
    count += 1
    nx = sx + dx[d]
    ny = sy + dy[d]
    if 0 <= nx < n and 0 <= ny < n:
        if graph[nx][ny] == 2:  # 사과
            snake.append((nx, ny))  # 뱀 꼬리
            graph[nx][ny] = 1
            sx, sy = nx, ny
        elif graph[nx][ny] == 1:  # 몸에 닿음
            break
        elif graph[nx][ny] == 0:  # 사과 없음 -> 길이 그대로
            tx, ty = snake.pop(0)  # 뱀 꼬리 삭제
            graph[tx][ty] = 0
            snake.append((nx, ny))  # 새로운 위치로 이동
            graph[nx][ny] = 1
            sx, sy = nx, ny
    else:
        break
        # 회전 시키기
    if turn_index < l:
        if count == turn_info[turn_index][0]:
            rotate(turn_info[turn_index][1])
            turn_index += 1


print(count)
728x90