히치키치

[백준] 3190번 : 뱀 - Python(파이썬) 본문

알고리즘 스터디

[백준] 3190번 : 뱀 - Python(파이썬)

히치키치 2023. 9. 4. 14:55

문제

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

풀이 참고 영상

https://www.youtube.com/watch?v=6lD3GPJp69U 

 

 

풀이

 

정답 코드

N = int(input())
K = int(input())
# 사과가 있는 부분 
apple = [list(map(int, input().split())) for _ in range(K)]
L = int(input())
dlst = [input().split() for _ in range(L)]

# 위, 오른쪽, 아래, 왼
di = [-1,0,1,0]
dj = [0,1,0,-1]

dtbl = {}             # 타임과 매칭되는 방향 전환
for sec,turn in dlst:
    dtbl[int(sec)]=turn

dr = 1                          # 오른쪽 방향
snake = [[1,1]]                 # 좌측상단
ans = 0                         # 0초

def rotation(dr, cmd):
    if dtbl[ans]=='D':      # 우회전 명령
        dr = (dr+1)%4
    elif dtbl[ans]=='L':    # 좌회전
        dr = (dr-1)%4
    return dr

while True:
    ans += 1                    # 1초 경과
    ci,cj = snake[0]            # 현재 머리좌표
    ni,nj = ci+di[dr],cj+dj[dr] # 진행방으로 한 칸 이동
    # 벽에 부딪힘 - 종료 
    if not(1<=ni<=N and 1<=nj<=N):
        break
    # 뱀의 몸에 부딪힘 - 종료
    if [ni,nj] in snake: 
        break
    
    # 머리 위치(뱀[0])에 이동 좌표 추가
    snake.insert(0,[ni,nj]) 
    
    # 이동 좌표가 사과 있는 좌표인 경우
    if [ni,nj] in apple:
        apple.remove([ni,nj])
    # 이동 좌표가 사과 없는 좌쵸인 경우 꼬리 부분(뱀[-1]) 제거
    else:
        snake.pop()  # 꼬리부분 제거
    # 방향전환
    if ans in dtbl.keys():
        dr = rotation(dr, dtbl[ans])


print(ans)
Comments