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