[백준 삼성기출 O] 뱀(python)

이진규·2022년 8월 1일
1

백준(PYTHON)

목록 보기
61/115

문제

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

나의 코드

"""

"""

from sys import stdin
input = stdin.readline

n = int(input()) # 보드의 크기
k = int(input()) # 사과의 개수

pan = [ [0] * n for _ in range(n) ]
for _ in range(k): # 사과의 개수만큼 좌표를 입력받아 사과(1)로 기록한다.
    a, b = map(int, input().split())
    pan[a-1][b-1] = 1
pan[0][0] = 2 # 뱀의 출발위치는 (0, 0)으로 뱀(2)로 기록한다.

l = int(input())
snake_dir = []
for _ in range(l): # 뱀이 시간마다 어디로 이동하는지 기록한다.
    a, b = input().split()
    snake_dir.append((int(a), b))

dx, dy = [0, 1, 0, -1], [1, 0, -1, 0] # 동, 남, 서, 북 ('D'이면 +1, 'L'이면 -1하면 방향이 적절하게 설정된다.)
time = 0 # 시간
k = 0 # 방향을 정할 변수
x, y = 0, 0 # 뱀의 시작 좌표
mx, my = 0, 0 # 뱀의 다음 좌표
tail_xy = [] # 뱀의 길이가 늘어남에 따른 뱀의 꼬리 부분 좌표

while True:
    if snake_dir: # 만약 뱀이 이동할 방향이 있다면
        if time == snake_dir[0][0]: # 현재 시간과 뱀이 X초 후 움직일 시간이 일치 한다면 방향을 수정한다.
            if snake_dir[0][1] == 'D':
                k += 1
            else:
                k -= 1
            mx = x + dx[k % 4]
            my = y + dy[k % 4]

            snake_dir.pop(0)
        else: # 시간이 일치하지 않는다면 방향을 수정하지 말고 직진하도록 한다.
            mx = x + dx[k % 4]
            my = y + dy[k % 4]
    else: # 뱀이 더 이상 이동할 필요가 없다면 방향은 바뀌지 않고 직진만 한다.
        mx = x + dx[k % 4]
        my = y + dy[k % 4]

    time += 1

    if mx < 0 or n <= mx or my < 0 or n <= my: # 벽을 만난다면 게임이 끝난다.
        break
    elif pan[mx][my] == 2: # 자기 자신과 부딪힌다면 게임이 끝난다.
        break
    elif pan[mx][my] == 1: # 사과가 있다면 뱀의 길이를 늘린다. (이때, 뱀의 꼬리 좌표를 기록한다.)
        pan[mx][my] = 2
        tail_xy.append((x, y))
    elif pan[mx][my] == 0: # 빈 공간이라면 뱀을 이동시킨다. (이때, 뱀의 꼬리 좌표를 기록한다.)
        pan[mx][my] = 2
        tail_xy.append((x, y))

        if tail_xy: # 뱀의 크기가 2 이상이라면 꼬리 부분을 0으로 바꾸고 뱀을 이동시킨다.
            pan[tail_xy[0][0]][tail_xy[0][1]] = 0 # 0번째 인덱스가 꼬리 부분이라고 할 수 있다.
            tail_xy.pop(0)
        else: # 뱀의 크기가 1 이라면 현재 위치를 0으로 바꾸고 뱀을 이동시킨다.
            pan[x][y] = 0

    x, y = mx, my # 현재 위치를 다음 위치로 갱신하고 끝낸다.

print(time)
    

설명

문제 설명 그대로 구현하면 되는데 변수가 많아서 조금 헷갈린다.
가장 핵심은 뱀이 이동할때 꼬리 좌표를 기록하는 변수를 두는것이 아닌가 싶음

참고 자료

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글