3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
큐를 이용한 구현 문제다. 큐에 뱀의 다음 머리 위치를 저장하고 꼬리 부분을 pop 시키면서 반복문을 돌아준다.
from collections import deque
# rotation 행렬
L_rotate = [[0, 1],
[-1, 0]]
R_rotate = [[0, -1],
[1, 0]]
N = int(input())
K = int(input())
apples = [list(map(int, input().split())) for _ in range(K)]
L = int(input())
turns = [list(input().split()) for _ in range(L)]
# 전체 보드
board = [[0 for _ in range(N)]
for _ in range(N)]
# 시작 위치는 가장 왼쪽 상단이다. 뱀을 2로 둔다.
board[0][0] = 2
# 사과는 1로 둔다.
for i, j in apples:
board[i-1][j-1] = 1
q = deque([[0, 0]]) # 시작 위치와 회전하는 시간을 큐로 저장한다.
turn = deque(turns)
move = [1, 0] # 시작 방향은 오른쪽이다.
t = 0
while q:
# 뱀 머리 위치는 큐 가장 끝에 있다.
x, y = q[-1]
nx = x + move[0] # 다음 방향 설정
ny = y + move[1]
t += 1
if (0 <= nx < N and 0 <= ny < N): # 보드 내부에서만 이동
if board[ny][nx] == 2: # 다음 위치가 뱀의 몸과 충돌한다면 종료
break
else:
if board[ny][nx] == 0: # 빈 공간이라면
x, y = q.popleft() # 꼬리 위치 pop
board[y][x] = 0 # 꼬리 위치 빈 공간으로
q.append([nx, ny]) # 큐에 다음 머리 위치 추가
board[ny][nx] = 2 # 머리 이동
else: # 보드 밖으로 나간다면 종료
break
if turn: # 아직 회전할게 남았다면
time, direction = turn.popleft() # 시간과 방향 pop
if t == int(time): 회전할 시간이라면
if direction == 'L': # 방향에 맞게 회전
x_move = L_rotate[0][0] * move[0] + L_rotate[0][1] * move[1]
y_move = L_rotate[1][0] * move[0] + L_rotate[1][1] * move[1]
else:
x_move = R_rotate[0][0] * move[0] + R_rotate[0][1] * move[1]
y_move = R_rotate[1][0] * move[0] + R_rotate[1][1] * move[1]
move = [x_move, y_move]
else: # 아니라면 다시 큐에 저장
turn.appendleft([time, direction])
print(t)
'알고리즘 > 백준' 카테고리의 다른 글
[백준 파이썬] 14891 톱니바퀴 (0) | 2023.07.27 |
---|---|
[백준 파이썬] 14503 로봇 청소기 (0) | 2023.07.21 |
[백준 파이썬] 4179 불! (0) | 2023.07.20 |
[백준 파이썬] 14501 퇴사 (0) | 2023.07.20 |
[백준 파이썬] 1244 스위치 켜고 끄기 (0) | 2023.07.19 |