3190. 뱀 문제 바로가기
해결 방법
주요 과정
입력값을 통해 필요한 변수들을 설정을 한다.
주요 변수 설명
board
: 사과의 위치를 저장한 정사각 보드 리스트y
,x
,d
: 뱀의 머리 위치와 방향을 저장하는 변수 ★snake_list
: 뱀의 몸이 있는 좌표들을 저장하는 리스트snake_info
: 입력 L개의 줄에 나와있는 뱀의 방향 변환 정보를 저장한 리스트
while 문을 통해 매 초 필요한 뱀의 동작을 구현한다.
종료 조건
- 뱀이 자기자신과 만나는 경우
- 벽에서 벗어난 경우
뱀의 주어진 방향(
d
) 만큼 진행시키며 종료 조건이 아닐 때- 사과 유무에 따라 동작한다.
- 사과 있으면 사과를 없앤다.
- 사과 없으면 몸 길이가 줄기에
snake_list
맨 앞의 인덱스(처음 저장된 값이기에 꼬리 부분!)를 제거한다.
- 사과 유무에 따라 동작한다.
snake_info
에 저장된 특정한 게임 시작 시간에 따라 뱀의 방향을 회전시킨다.※ 주의 : info < len(snake_info) 가 없을 경우 런타임 에러(IndexError) 발생!
1 2 3 4 5 6
if info < len(snake_info) and time == snake_info[info][0]: # 방향 변환을 해야할 때 if snake_info[info][1] == "L": # 왼쪽으로 방향을 돌리기 d = (d + 1) % 4 else: # 오른쪽으로 방향 돌리기 d = (d + 3) % 4 info += 1
구현한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
N = int(input())
board = [[0]*N for _ in range(N)]
snake_info = []
y, x, d = 0, 0, 0 # 뱀이 머리 위치 좌표와 방향 저장할 변수
snake_list = [[0, 0]] # 뱀이 어디에 있는지 좌표를 저장할 리스트
dirs = [[0, 1], [-1, 0], [0, -1], [1, 0]]
info = 0
time = 0
# 사과 위치 저장하기
for _ in range(int(input())):
i, j = map(int, input().split())
board[i-1][j-1] = 1
# 뱀의 방향 정보 저장하기
for _ in range(int(input())):
X, C = map(str, input().split())
snake_info.append([int(X), C])
while True:
time += 1
y, x = y + dirs[d][0], x + dirs[d][1]
# 종료조건
if [y, x] in snake_list: break # 뱀이 자기자신과 만날 경우
if y < 0 or x < 0 or y >= N or x >= N: # 벽에서 벗어난 경우
break
if board[y][x]== 1: # 사과일 경우
board[y][x] = 0
else:
snake_list.pop(0) # 사과가 없기에 뱀의 꼬리 부분이 이동하여 빼주기
snake_list.append([y, x]) # 뱀의 머리 부분 저장
if info < len(snake_info) and time == snake_info[info][0]:
if snake_info[info][1] == "L": # 왼쪽으로 방향을 돌리기
d = (d + 1) % 4
else: # 오른쪽으로 방향 돌리기
d = (d + 3) % 4
info += 1
print(time)