(Python) 백준 3190번 : 뱀

Couch Potato·2020년 9월 22일
0

algorithm

목록 보기
5/15

(Python) 백준 3190번: 뱀

문제 설명

  • 뱀은 사과를 먹으면 길이가 1씩 증가한다.
  • 뱀이 벽 or 자신의 몸과 부딪히면 게임은 끝난다.
  • NxN 크기의 정사각 보드위에서 게임이 진행된다. 외곽은 벽으로 되어 있다.
  • 정사각 보드 위의 몇몇 칸에는 사과가 놓여져 있다.
  • 뱀의 첫 시작 위치는 맨위 맨왼쪽(1행 1열), 길이는 1, 방향은 오른쪽을 향한채로 시작한다.

뱀은 매 초마다 다음과 같은 규칙을 따라 이동한다.

  • 뱀은 먼저 몸길이를 늘려서 머리를 다음칸에 위치시킨다.
  • 이동한 칸에 사과가 있다 -> 사과 제거, 꼬리는 그대로.
  • 이동한 칸에 사과가 없다 -> 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.

출력해야 하는 값

  • 사과의 위치와 뱀의 이동경로가 주어진다.
  • 이 게임은 몇 초에 끝나는가?

출처: https://juhee-maeng.tistory.com/54 [BIU]

알아야 할 것

  • 동서남북 0,1,2,3 -> dictionary 형태로 저장하여 x,y 좌표값 while문 사용해서 바꿔줌
  • if문 사용하여 0<x<N, 0<y<N 좌표값 확인
  • 리스트 행,열 벗어나면 IndexError: list index out of range 발생! 항상 len 먼저 체크해주고, 값 확인!
# 끝을 만났을 때는 die
# apple -> 몸길이 +1,
# (0,0)부터 시작

def Solution():
    time = 0
    # 북동남서
    snake_array = []
    direction = {0:(0,1), 1:(1,0),2:(0,-1),3:(-1,0)}
    dir = 0 # 동쪽

    # empty:0, 사과:1, 뱀:2
    nx,ny = 0,0
    board[0][0] = 2 # start
    snake_array.append([0,0])

    # 끝날때까지 돌기
    while(1):
        time += 1
        nx = nx + direction[dir][0]
        ny = ny + direction[dir][1]
  
        if not 0<= nx <N or not 0<= ny <N:
             break
	
    	# apple
        if board[nx][ny] == 1:
            board[nx][ny] = 2 # 머리 이동
            snake_array.append([nx,ny])

        # empty
        elif board[nx][ny] == 0:
            board[nx][ny] = 2
            snake_array.append([nx,ny])
            del_x, del_y = snake_array.pop(0)
            board[del_x][del_y] = 0

        # snake 몸통
        elif board[nx][ny] == 2:
            break

        if len(snake_dir) != 0 and time == snake_dir[0][0]:
                time, new_dir = snake_dir.pop(0)
                if new_dir == 'L': # 왼쪽
                    dir = (dir + 3) % 4
                elif new_dir == 'D':
                    dir = (dir + 1) % 4

    return time

# 오른쪽/ 왼쪽 방향 바꾸는 건 % 연산자 이용하여 쉽게 할 수 있음
# 왼쪽으로 돌리기 = (현재 방향 + 3) % 4
# 오른쪽으로 돌리기 = (현재 방향 + 1) % 4
# board
N = int(input())
board = [[0 for i in range(N)] for j in range(N)]

# apple 넣기
k = int(input())
apple_locs = []
for _ in range(k):
    x, y = map(int, input().split())
    board[x-1][y-1] = 1

# snake 시간, 방향
l = int(input())
# (sec, c(left) or d(right))
snake_dir = list(map(lambda x:[int(x[0]),str(x[1])],\
                     [input().split() for _ in range(l)])) 
print(Solution())

0개의 댓글