찔끔찔끔씩😎

[백준] 3190번 뱀 - python (삼성 sw 기출) 본문

Algorithm/백준

[백준] 3190번 뱀 - python (삼성 sw 기출)

댕경 2021. 11. 5. 22:14
728x90

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

 

3190번: 뱀

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

www.acmicpc.net


문제

사과를 만나면 길이 +1, 아니면 그대로

벽이나 몸에 닿으면 게임 끝


해결

empty : 0 , 뱀 위치 : 1, 사과 위치 : 2

머리가 갈 곳을 계속 1로 만들며 snake 배열에 append 해준다.

만약 사과가 없다면,

길이를 유지 해주어야 하기 때문에 머리 위치를 append 함과 동시에 꼬리 위치를 pop 해준다. (= 길이 그대로 )

 

시간과 방향은 0으로 초기화된 times 배열에 넣어주고

방향을 바꾸어야할 시간 인덱스에 방향을 넣어준다.

ex) 15초 뒤 L 로 방향전환 -> times[15] = L


코드

n = int(input())
board = [[0]*n for _ in range (n)] # empty : 0

k = int(input())
for _ in range (k):
    x,y = map(int,input().split())
    board[x-1][y-1] = 2 # 사과 위치: 2

l = int(input())
times = [0]*10000
for _ in range(l):
    when, dir = input().split()
    times[int(when)] = dir

snake = []
snake.append([0,0])
board[0][0] = 1 # 뱀 위치: 1

dx = [-1,0,1,0]
dy = [0,1,0,-1]
dir = 1 # 동쪽 바라보고 시작
nx, ny = 0 , 0 # (0,0) 에서 시작

time = 0

while(True):
    time += 1
    nx = nx + dx[dir]
    ny = ny + dy[dir]

    if ( nx<0 or nx>=n or ny<0 or ny>=n or board[nx][ny]==1): # 벽이나, 몸에 닿으면
        break

    if ( board[nx][ny] ==2 ): # 사과 있으면
        snake.append([nx,ny])
        board[nx][ny] = 1
    
    elif ( board[nx][ny] == 0): # 사과 없으면
        snake.append([nx,ny])
        board[nx][ny] = 1

        delX,delY = snake.pop(0)
        board[delX][delY] = 0

    if ( times[time] == 'D'): # 방향 전환해야할 시간이면
        dir = ( dir+1 )%4
    elif ( times[time] == 'L'):
        dir = ( dir+3 )%4

print(time)
Comments