본문 바로가기

두두의 알고리즘/문제

[구현] 백준 3190번 '뱀' (Python)

728x90

<문제 링크>

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

 

3190번: 뱀

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

www.acmicpc.net


<문제 풀이>

1. 사과 있는 곳은 1로 표시

2. 방향 지정 함수 만들기

3. q를 사용하여 뱀의 위치 저장. 사과가 없을 때 가장 왼쪽 좌표 제거하면 도미

4. 벽이나 뱀의 몸통과 부딪혔다면 종료

 

<코드>

n = int(input())
k = int(input())
data = [[0]*(n+1) for _ in range(n+1)]
info = []

for _ in range(k):
	a,b = map(int,input().split())
    data[a][b] = 1

l = int(input())
for _ in range(l):
	x,c = input().split()
    info.append((int(x),c))

dx = [0,1,0,-1]
dy = [1,0,-1,0]

def turn(direction,c):
	if c=="L":
    	direction = (direction-1)%4
    else:
    	direction = (direction+1)%4
    return direction
    
def simulate():
	x,y = 1,1
    data[x][y] = 2
    direction = 0
    time = 0
    index = 0
    q = [(x,y)]
    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 time==info[index][0]:
        	direciton = turn(direction, info[index[1])
            index += 1
    return time

print(simulate())
'''
6
3
3 4
2 5
5 3
3
3 D
15 L
17 D

10
4
1 2
1 3
1 4
1 5
4
8 D
10 D
11 D
13 L

10
5
1 5
1 3
1 2
1 6
1 7
4
8 D
10 D
11 D
13 L
'''

#220325
n = int(input())
k = int(input())

graph = [[0]*(n) for i in range(n)]
for i in range(k):
    x,y = map(int,input().split())
    graph[x-1][y-1] = 1
l = int(input())
snake = []
for i in range(l):
    snake.append(input().split())

def direction(d,x,y):
    if d=='R':
        return x,y+1
    elif d=='L':
        return x,y-1
    elif d=='U':
        return x-1,y
    elif d=='D':
        return x+1,y

x,y = 0,0
d = 'R'
answer = 0
idx = 0
graph[x][y] = 9

while True:
    xx,yy = direction(d, x, y)
    if xx>=0 and yy>=0 and xx<n and yy<n:
        answer += 1
        if graph[xx][yy] == 0:
            graph[x][y] = 0
            x,y = xx,yy
        elif graph[x][y]==9:
            break
        graph[xx][yy] = 9
        if idx<l and int(snake[idx][0])==answer:
            d = snake[idx][1]
            idx += 1
    else:
        break

 

<고쳐야 할 점>

  • 뱀 꼬리가 삭제되는 거 주의,,,
  • 복습 알고리즘