백준 3190과 같은 문제
- 링크 : https://www.acmicpc.net/problem/3190
사과의 위치와 뱀의 이동경로가 주어질 때, 이 게임이 몇 초에 끝나는지 계산하라.
조건
- 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1, 처음에 오른쪽을 향한다.
- 보드의 크기 N
- 사과의 개수 K
- 사과의 위치 ( 행, 열 ) , 위치는 모두 다르며, 1행1열 맨 위 맨 좌측에는 사과가 없다.
- 뱀의 방향 변환 횟수 L
- 정수 X, 문자 C : X초가 끝난 뒤에 왼쪽 L 또는 오른쪽 D로 90도 방향을 회전시킨다. X는 10000 이하의 양의 정수, 방향 전환 정보는 X가 증가하는 순으로 주어진다.
게임이 몇 초에 끝나는지 출력하라.
## 데이터 입력 (판 그리기 , 사과 입력하기 )
# 보드 0 으로 이루어지고
# 사과는 1로 두고 , 뱀은 2로 둔다.
n = int(input()) # 보드크기
k = int(input()) # 사과의 수
data = [[0]* (n+1) for _ in range(n+1)] # 기준이 1,1 이니까
for _ in range(k):
a, b = map(int, input().split())
data[a][b] = 1 # 맵에 사과 입력
# 방향정보 입력
info = [] # 방향 전환정보
l = int(input())
for _ in range(l):
x, c = input().split()
info.append((int(x), c))
# 방향 회전 함수 , 시계 방향으로 , 인덱스가 + 되면 동쪽으로 회전, -면 서쪽으로 회전
dx = [0, 1, 0, -1] # 처음 위치 동쪽, 동 남 서 북 순서 # dx가 y축이다.
dy = [1, 0, -1, 0]
def turn(direction, c): # 현재방향과, 방향 전환 문자 가 매개변수로 들어온다.
if c == "L": # 왼쪽 회전 , 반시계 방향 90도
direction = (direction - 1)%4 # 나머지를 구하면, 무슨 값이든 0~3까지
else: # 오른쪽 회전, 시계 방향 90도
direction = (direction + 1)%4 # direction은 dx, dy의 인덱스 역할
return direction
## 시뮬레이션 함수
def simulate():
# 변수, 초기화
x, y = 1,1 # 시작점 , 캐릭터, x, y
data[x][y] = 2 # 뱀의 존재를 맵에 표시
direction = 0 # 처음 동쪽 방향을 0을 한다. direction은 인덱스니까
time = 0 # 처음 시간 초기화
index = 0 # 다음 회전 정보 , info의 인덱스로 사용한다. 차례차례 회전진행
q = [(x,y)] # 뱀, 큐 자료구조로 , 지나가면 map을 0으로 바꿔주기 위해서
# 시뮬레이션 본격 시작
while True:
nx = x + dx[direction] # 이동 준비, 다음 갈 좌표
ny = y + dy[direction]
if 1<= nx and nx <= n and 1 <=ny and ny <=n and data[nx][ny] !=2:
if data[nx][ny] == 0: # 사과 없으면
data[nx][ny] = 2 # 맵에 이동 표시
q.append((nx,ny)) # 뱀 머리 업데이트
px, py = q.pop(0) # 꼬리 떼낸다.
data[px][py] = 0 # 꼬리 맵에서 지워준다.
if data[nx][ny] == 1: # 사과가 있으면
data[nx][ny] = 2 # 맵에 이동 표시
q.append((nx,ny)) # 머리 업데이트하고, 꼬리는 안뗀다.
else : # 다음이 부딪힌걸 확인한거고, 실제 이동할때, 시간 올리면서 종료
time += 1
break
x, y = nx, ny # 뱀 이동, 시간도 같이 흘러간다.
time += 1
if index < l and info[index][0] == time : # 회전할 시간인지 확인
direction = turn(direction, info[index][1])
index += 1 # 받은 회전 중 몇번 했는지
return time
print(simulate())