공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 백준 3190. 뱀

inspirit941 2019. 11. 26. 18:35
반응형

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

 

3190번: 뱀

문제  'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따

www.acmicpc.net

시뮬레이션 문제. 주어진 조건대로 프로그램을 짜면 충분히 해결할 수 있다.

'방향을 바꾸는 경우'를 계산하기 위한 함수를 만들고, 뱀의 좌표를 저장하기 위해 deque의 appendleft와 pop을 사용했다.

 

 

import sys
from collections import deque
N = int(sys.stdin.readline())
K = int(sys.stdin.readline())
maps = [[0 for _ in range(N)] for _ in range(N)]
for _ in range(K):
y, x = map(int, sys.stdin.readline().split())
# 사과 위치 표시하기.
maps[y-1][x-1] = 2
# 방향이 바뀌어야 하는 시간대 저장하기.
change = {}
L = int(sys.stdin.readline())
for _ in range(L):
time, letter = sys.stdin.readline().split()
change[int(time)] = letter
# 처음 위치, 처음 움직일 방향 설정
maps[0][0] = 1
move = (0,1)
# 방향 바꾸는 함수
def change_dir(move, Letter):
y, x = move
# x축 기준으로 이동할 때
if y == 0:
if Letter == 'D':
if x > 0:
return (1,0)
else:
return (-1,0)
else:
if x > 0:
return (-1,-0)
else:
return (1,0)
# y축 기준으로 이동할 때
elif x == 0:
if Letter == 'D':
if y > 0:
return (0,-1)
else:
return (0,1)
else:
if y > 0:
return (0,1)
else:
return (0,-1)
time = 0
y, x = 0, 0
# 뱀 좌표 저장하기
snake = deque()
snake.append((y, x))
while True:
time += 1
dy, dx = move
ny, nx = y + dy, x + dx
# 보드 위에 있을 때
if 0 <= ny < N and 0 <= nx < N:
# 사과인 경우
if maps[ny][nx] == 2:
snake.appendleft((ny, nx))
maps[ny][nx] = 1
# 빈 칸인 경우
elif maps[ny][nx] == 0:
maps[ny][nx] = 1
snake.appendleft((ny, nx))
# 맨 뒷꼬리 부분을 빼낸다.
taily, tailx = snake.pop()
maps[taily][tailx] = 0
# 자기 몸에 부딪혔으므로 더 이상 진행하지 않는다.
elif maps[ny][nx] == 1:
break
y, x = ny, nx
# 방향을 변환해야 하는 시간인 경우
if time in change:
move = change_dir(move, change[time])
# 보드를 벗어난 경우이므로 반복문을 종료한다.
else:
break
print(time)
view raw [백준] 뱀.py hosted with ❤ by GitHub
반응형