1. 문제 출처
https://www.acmicpc.net/problem/3190
2. 풀이
몸의 좌표 배열은 머리가 앞에서 추가되고 꼬리는 뒤에서 빠져야 하기 때문에 자료 구조를 덱으로 생각하고 사용 하였고방향 전환 배열은 먼저 추가한 데이터를 먼저 빼서 사용해야 하기 때문에 큐 라고 생각 하고 사용 하였다.
# 필요한 변수 선언 및 초기화
size = int(input())
apple_num = int(input())
apple_list = []
body = [[0,0]]
head_angle = 0
time =0
for _ in range(apple_num):
apple_list.append(list(map(int,input().split())))
line_list = []
for _ in range(int(input())):
line_list.append(input().split())
# 보고 있는 방향으로 움직이기
def go(x,y,angle):
if angle == 0 :
x+=1
elif angle == 90:
y+=1
elif angle == 180:
x-=1
else:
y-=1
return x,y
# 게임이 끝날 때 까지 반복
while True:
#뱀 머리의 x,y좌표
x,y = body[0]
# 만약 방향 변환 정보 리스트가 비어있지 않으면
if line_list:
# 만약 그 정보의 맨 앞의 값이 현재 시간과 같은면
if int(line_list[0][0]) == time:
# 회전 방향에 따라 뱀이 보고 있는 방향을 바꾼다.
direction = line_list.pop(0)[1]
if direction == "L":
head_angle -= 90
if head_angle == -90:
head_angle = 270
if direction == "D":
head_angle += 90
if head_angle == 360:
head_angle = 0
# 뱀이 보고 있는 방향으로 움직인다.
x,y = go(x,y,head_angle)
# 움직였으니 시간에 1초를 더한다.
time +=1
# 움직인 곳에 벽이 있거나 몸이 있으면 시간을 출력하고 반복문 종료
if (0<=x<size )and (0<=y<size) and ([x,y] not in body):
# 만약 도착한 좌표가 사과가 있지 않은 곳이면
#(사과의 좌표는 1부터 시작해 행,렬 순으로 이루어져 있고
# 현재 뱀 머리의 0부터 시작하여 열, 순으로 되어있기 때문에 다음과 같이 비교한다.)
if [y+1,x+1] not in apple_list:
# 몸의 길이는 유지 되기 때문에 꼬리부분의 좌표를 뺀다.
body.pop()
else:
# 만약 사과가 있다면 사과를 제거하고 꼬리부분의 좌표를 유지한다.
apple_list.remove([y+1,x+1])
# 몸에 머리의 좌표를 앞애 추가한다.
body.insert(0,[x,y])
else:
print(time)
break
'알고리즘' 카테고리의 다른 글
10825-백준-국영수 (1) | 2023.02.20 |
---|---|
18406 - 백준 - 럭키스트레이트 (0) | 2023.02.15 |
1439-백준-뒤집기 (0) | 2023.02.13 |
2618- 백준 - 경찰차 (0) | 2023.02.10 |
1254-백준-팰린드롬 만들기 (0) | 2023.02.09 |