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


시뮬레이션 문제. 주어진 조건대로 프로그램을 짜면 충분히 해결할 수 있다.
'방향을 바꾸는 경우'를 계산하기 위한 함수를 만들고, 뱀의 좌표를 저장하기 위해 deque의 appendleft와 pop을 사용했다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
반응형
'프로그래밍 > 코딩테스트 문제풀이' 카테고리의 다른 글
[Python] 프로그래머스. 2020 카카오 recruit - 기둥과 보 설치 (Level 3) (0) | 2019.11.28 |
---|---|
[Python] 프로그래머스. 단속카메라 (Level 3) (0) | 2019.11.27 |
[Python] 프로그래머스. 쿠키 구입 (Level 4) (0) | 2019.11.25 |
[Python] 백준 14890. 경사로 (0) | 2019.11.24 |
[Python] 프로그래머스. 등굣길 (Level 3) (0) | 2019.11.23 |