Open robert-min opened 2 months ago
⏰ 소요 시간 : 30분 🗂️ 유형 :구현
🖌️ 문제 풀이
"""
Return : 게임이 몇 초에 끝나는지
매 시간 마다 이동(while) time += 1
1. 머리를 현재 바라보고 있는 칸으로 이동
2. 이동했을 때, matrix 밖 또는 자기 몸(visited)에 부딪히면 끝
3. 이동했을 때, 사과 O >> 꼬리 그대로 / 사과 X >> 꼬리 줄이기
- visited 가장 먼저 들어온 값 삭제 >> Q
4. time == orders[] 인 경우 방향 변경
- L은 왼쪽, D는 오른쪽으로 90도
- 위, 오른, 아래, 왼
- D일 경우 +1, L일 경우 -1
- <0 >> 3, 4> >> 0 으로
Return : time
"""
import sys
from collections import deque
input = sys.stdin.readline
N = int(input())
matrix = [[0] * N for _ in range(N)]
K = int(input())
for _ in range(K):
x, y = map(int, input().split())
x -= 1
y -= 1
matrix[x][y] = 1
orders = deque([])
L = int(input())
for _ in range(L):
time, direct = input().split()
orders.append((int(time), direct))
def change_dir(now_dir, dir):
if dir == "L":
now_dir -= 1
elif dir == "D":
now_dir += 1
if now_dir < 0:
now_dir = 3
elif now_dir == 4:
now_dir = 0
return now_dir
time = 0
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
x, y = 0, 0
Q = deque([(0, 0)])
visited = [[0] * N for _ in range(N)]
visited[0][0] = 1
now_dir = 1 # 오른쪽
while True:
time += 1
nx = x + dx[now_dir]
ny = y + dy[now_dir]
# matrix 밖
if nx < 0 or ny < 0 or nx >= N or ny >= N:
break
# 자기 몸(visited)에 부딪
if (nx, ny) in Q:
break
# 사과 O >> 꼬리 줄이기
if matrix[nx][ny] == 1:
matrix[nx][ny] = 0
else:
Q.popleft()
# time == orders[] 인 경우 방향 변경
if orders and time == orders[0][0]:
_, dir = orders.popleft()
now_dir = change_dir(now_dir, dir)
visited[nx][ny] = 1
Q.append((nx, ny))
x, y = nx, ny
print(time)
문제 추천 이유!!
문제 링크
https://www.acmicpc.net/problem/3190
*작성가이드 입니다.
아래는 comment 템플릿입니다.(복사해서 사용)