[10/14] 3190 (뱀)

이경준·2021년 10월 14일
0

코테

목록 보기
129/140
post-custom-banner

골드5 문제
시뮬레이션 (1시간 20분 소요)

내 코드

from collections import deque

def change(dire, num): # 방향변환 함수
    if (dire == 'L'):
        if num == 3: num = 0
        else: num += 1
    else:
        if num == 0: num = 3
        else: num -= 1
    return num

def move(hh, ww, dire): # 이동하는 좌표 변환 함수
    if ( dire == 0 ): ww += 1
    elif ( dire == 1 ): hh -= 1
    elif ( dire == 2 ): ww -= 1
    elif ( dire == 3 ): hh += 1
    
    # 뱀이 지도 밖으로 나가는 경우도 고려
    if ( hh < 1 or hh > n or ww < 1 or ww > n ):
        hh, ww = 999, 999
    return hh, ww

n = int(input())
k = int(input())
arr = [[0] * (n+1) for _ in range(n+1)]
snake = deque([[1, 1]])
second = 0
toward = 0 # 방향숫자 : 동북서남(0,1,2,3)
h, w = 1, 1

for _ in range(k):
    y, x = map(int, input().split())
    arr[y][x] = 1

L = int(input())
direction = deque([])
for _ in range(L):
    x, c = input().split()
    x = int(x)
    direction.append([x, c])
    
while True:
    second += 1 # 시간 흐름
    h, w = move(h, w, toward) # 이동 (방향 고려)
    
    # 지도 밖으로 나가면 종료
    if (h == 999 and w == 999):
        break
    # 머리와 꼬리가 부딪히면 종료
    #if ( h == snake[-1][0] and w == snake[-1][1] ):
    #    break
    
    # 머리가 몸통과 부딪히면 종료
    if ([h, w] in snake):
        break
    
    # 이동한 곳에 사과가 있는지 확인
    if ( arr[h][w] == 1 ):
        snake.appendleft([h, w])
        arr[h][w] = 0
    else:
        snake.appendleft([h, w])
        snake.pop()
    
    # 움직이고, 끝나면 방향 회전 (리스트가 비어있으면 그냥 지나감)
    if ( len(direction) != 0 and direction[0][0] == second ):
        direct = direction[0][1]
        direction.popleft()
        # 방향 회전 (LD와 방향숫자를 통째로 함수에 넘김)
        toward = change(direct, toward)
    
    # 종료 조건
    if ( len(snake) == 0 ):
        break
    
print(second)

로직

  • 문제에서 시킨대로 했다.

피드백

  • 사과를 먹었으면 1에서 0으로 바꿔줘야 했는데, 놓쳤다.
  • 뱀의 몸이 서로 부딪히면 종료해야 하는데, 뱀의 머리와 꼬리에만 집착했다.
profile
The Show Must Go On
post-custom-banner

0개의 댓글