https://www.acmicpc.net/problem/3190
공부날짜 : 2022.08.23
정답 참조 여부 : X
뱀 게임을 시뮬레이션 하며 입력된 움직임에따라 움직였을때 언제 gameover되는지 출력하는 문제이다.
문제에서 제시되는대로 차근차근 코딩하면 되는 문제로 별로 어렵지 않았다.
본인은 마지막 조건에 따라 방향전환을 하는 부분에서 어려움을 겪었는데
while True:
x,c = pass_[index_]
~~~
#시간이 조건을 충족하면 방향을 바꾸고 index+1
if index_ < l and time == pass_[index_][0]:
index_ +=1
이런식으로 코드를 작성했더니 indexerror가 발생해서
#시간이 조건을 충족하면 방향을 바꾸고 index+1
if index_ < l-1 and time == pass_[index_][0]:
index_ +=1
무지성으로 l-1로 바꿔줬다
하지만 이렇게 작성할 경우 마지막 방향전환은 하지 않는다
(index_ = l-1 일때 조건에 맞게 들어가지 않아 방향전환을 하지 않음)
이것때문에 꽤 오래 고민하다가 다른곳에서 디버깅해보고 발견했다.
배열의 index를 다루는게 아직 헷갈리는 부분이 많으니 신경 많이써야 겠다.
import sys
input = sys.stdin.readline
n = int(input())
k = int(input())
#사과 위치가 저장될 data
data = [[0]*n for _ in range(n)]
for _ in range(k):
x,y = map(int, input().split())
#맨 좌측 맨 위가 1,1이므로 편한 연산을 위해 -1
#빈칸은 0, 사과는 1
data[x-1][y-1] = 1
l = int(input())
pass_ = []
for _ in range(l):
x,c = input().split()
pass_.append([int(x),c])
dx = [0,1,0,-1]
dy = [1,0,-1,0]
#뱀의 모양을 저장하는 배열
snake = [[0,0]]
data[0][0] = 2
#초기방향 오른쪽, 시간0, pass_참조 index = 0
dir = 0
time = 0
index_ = 0
while True:
nx = snake[-1][0] + dx[dir]
ny = snake[-1][1] + dy[dir]
time += 1
#벽만나면 멈춤
if nx < 0 or nx >= n or ny < 0 or ny >= n:
break
#몸만나면 멈춤
if data[nx][ny] == 2:
break
snake.append([nx,ny])
#사과가 없으면 꼬리를 없앤다
if data[nx][ny] == 0:
data[nx][ny] = 2
q = snake.pop(0)
data[q[0]][q[1]] = 0
#사과가 있으면 꼬리는 유지하고 사과를 없앤다
elif data[nx][ny] == 1:
data[nx][ny] = 2
#시간이 조건을 충족하면 방향을 바꾸고 index+1
if index_ < l and time == pass_[index_][0]:
if pass_[index_][1] == "L":
dir -= 1
elif pass_[index_][1] == "D":
dir += 1
dir %= 4
index_ += 1
print(time)