1. 문제

14499번: 주사위 굴리기

2. 개요

한 보드 위에서 모든 면이 0인 주사위를 명령에 따라 1칸씩 굴린다.

이때 보드의 칸의 수가 0이라면 주사위의 밑 면의 수를 해당 칸에 복사하고, 그렇지 않다면 주사위의 밑 면에 해당 숫자를 복사하는 작업을 진행해나갈 때, (보드 밖으로 나가려는 명령은 무시) 주사위의 윗 면에 쓰인 수를 계속해서 출력하는 문제.

3. 코드 및 추가내용

import sys

N, M, y, x, K = map(int, sys.stdin.readline().split())

board = []
for i in range(N):
    board.append(list(map(int, sys.stdin.readline().split())))

commands = list(map(int, sys.stdin.readline().split()))

dice = [[0],[0,0,0],[0],[0]]

dirY, dirX = [0, 0, -1, 1], [1, -1, 0, 0]

for command in commands:
    nextY, nextX = y + dirY[command - 1], x + dirX[command - 1]

    if nextY >= N or nextY < 0 or nextX >= M or nextX < 0:
        continue

    if command == 1:
        dice[1], dice[3] = dice[3] + dice[1][:2], [dice[1][2]]

    elif command == 2:
        dice[1], dice[3] = dice[1][1:] + dice[3], [dice[1][0]]

    elif command == 3:
        dice[0][0], dice[1][1], dice[2][0], dice[3][0] = dice[1][1], dice[2][0], dice[3][0], dice[0][0]

    else:
        dice[0][0], dice[1][1], dice[2][0], dice[3][0] = dice[3][0], dice[0][0], dice[1][1], dice[2][0]

    if board[nextY][nextX] == 0:
        board[nextY][nextX] = dice[3][0]

    else:
        dice[3][0] = board[nextY][nextX]
        board[nextY][nextX] = 0

    y, x = nextY, nextX
    print(dice[1][1])

일단 입력을 모두 받아준 후, 리스트로 주사위를 만든다.

주사위는 [[뒷면], [왼쪽면, 윗면, 오른쪽면], [앞면], [밑면]] 의 구조로 만들었다.

명령은 1,2,3,4가 있고 순서대로 동,서,북,남이므로 방향을 나타낼 리스트도 그에 맞게 만들어둔다.

명령들을 하나씩 탐색하며 다음 위치를 확인하여 보드 밖으로 나갈 경우 continue로 무시하게하고 명령에 따라 알맞게 주사위를 회전시킨다.

해당 칸의 숫자를 판단하여 보드에 밑면 숫자를 복사 또는 밑면 숫자를 보드에 복사, 밑면 0처리를 하고 현재위치를 다시 갱신한 뒤, 윗면의 숫자를 출력하는 것을 반복한다.

Comments