[Python][백준] 3190번 뱀

신남·2022년 8월 23일

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)

0개의 댓글