알고리즘

3190-백준-뱀

easysheep 2023. 2. 14. 00:29

1. 문제 출처

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

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