백준|3190번|뱀

README·2022년 7월 31일
0

파이썬 PS풀이

목록 보기
79/136

문제설명
뱀이 맵을 기어다니면서 벽에 부딪히거나 자신의 몸을 밟는데 얼마의 시간이 걸리는 지 출력하는 문제입니다,

규칙
1. 처음에는 오른쪽으로 이동하고 시간이 지남에 따라서 이동방향이 달라진다.
2. 뱀이 이동하는 방식은 머리를 이동할칸으로 이동시키고 해당 자리에 사과가 있을 경우 그 사과를 먹고 몸 길이가 길어진다. 사과가 없을 경우 꼬리를 앞칸으로 당긴다.

작동 순서
1. 맵의 크기를 입력받고 맵을 생성합니다.
2. 사과의 개수를 입력받고 사과의 위치를 입력받습니다.
3. 방향전환의 횟수를 입력받고 방향을 전환할 시간과 전환할 방향을 입력받습니다.
4. 뱀의 위치를 저장하는 큐(snakesBodyX, snakesBodyY)를 생성합니다.
5. 초기 방향, 시간, 몸길이, 다음 방향 전환 시간를 지정합니다.
6. 뱀의 위치 0,0을 저장하고 다음 방향으로 이동합니다.
7. 뱀이 시간에 따라 방향을 바꿔가며 이동하고 사과를 먹을 경우 몸길이를 늘립니다.
8. 뱀이 벽에 부딪히거나 자신의 몸을 밟은 경우 게임을 종료시키고 게임이 진행된 시간을 출력합니다.

소스코드

import sys
from collections import deque

N = int(sys.stdin.readline())
gameMap = [[0 for j in range(N)] for i in range(N)]

K = int(sys.stdin.readline())
for i in range(K):
    H, W = map(int, sys.stdin.readline().split())
    gameMap[H-1][W-1] = 1

L = int(sys.stdin.readline())
changeDircetion = []
for i in range(L):
    T, W = map(str, sys.stdin.readline().split())
    changeDircetion.append([int(T), W])

snakesBodyX = deque()
snakesBodyY = deque()
direction = 'D'
time = 0
bodyLength = 1
gameOver = False
directionChangeTime = 0
directionXY = [[-1, 0], [1, 0], [0, -1], [0, 1]]

snakesBodyX.append(0)
snakesBodyY.append(0)

while not gameOver:
    time += 1
    if direction == 'D':
        headLocationX = snakesBodyX[-1] + directionXY[3][0]
        headLocationY = snakesBodyY[-1] + directionXY[3][1]

    elif direction == 'L':
        headLocationX = snakesBodyX[-1] + directionXY[2][0]
        headLocationY = snakesBodyY[-1] + directionXY[2][1]

    elif direction == 'U':
        headLocationX = snakesBodyX[-1] + directionXY[0][0]
        headLocationY = snakesBodyY[-1] + directionXY[0][1]

    else:
        headLocationX = snakesBodyX[-1] + directionXY[1][0]
        headLocationY = snakesBodyY[-1] + directionXY[1][1]

    if 0 > headLocationX or headLocationX >= N or 0 > headLocationY or headLocationY >= N:
        gameOver = True
        break

    for i in range(bodyLength):
        if snakesBodyX[i] == headLocationX and snakesBodyY[i] == headLocationY:
            gameOver = True
            break

    snakesBodyX.append(headLocationX)
    snakesBodyY.append(headLocationY)

    if gameMap[snakesBodyX[-1]][snakesBodyY[-1]] != 1:
        snakesBodyX.popleft()
        snakesBodyY.popleft()
    else:
        bodyLength += 1
        gameMap[snakesBodyX[-1]][snakesBodyY[-1]] = 0

    if time == changeDircetion[directionChangeTime][0]:
        if changeDircetion[directionChangeTime][1] == 'D':
            if direction == 'D':
                direction = 'B'
            elif direction == 'L':
                direction = 'U'
            elif direction == 'B':
                direction = 'L'
            else:
                direction = 'D'
        else:
            if direction == 'D':
                direction = 'U'
            elif direction == 'L':
                direction = 'B'
            elif direction == 'B':
                direction = 'D'
            else:
                direction = 'L'
        if directionChangeTime < L-1:
            directionChangeTime += 1
print(time)

후기
문제를 풀 때부터 어려웠는데 수행과정을 설명하는 것도 어렵네요... 설명이 많이 부족한 것 같고 제 실력도 많이 부족한 것 같습니다. 계속해서 꾸준히 노력해야 할 것 같습니다.

profile
INTP 개발자 지망생

0개의 댓글