본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 14499 주사위 굴리기

by Alan_Kim 2023. 5. 18.
728x90
반응형

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

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

 

문제 해결

  • 주사위와 지도에 대해서 이해하기 어려웠다.
  • 주사위를 굴린다는것은 오른쪽, 왼쪽, 위쪽, 아래쪽으로 한 칸 굴린다는 것을 이해하면 문제가 쉬워진다.
  • 시물레이션 문제이다.
  • 한번 굴릴 때 어떻게 지도에서 움직이는지 이해하고 그래서 주사위를 어떻게 굴렸는지 알고 숫자를 변경시키고 주사위 위쪽 숫자를 출력하면 해결된다.

CODE

import sys

input = sys.stdin.readline


def move_right():
    temp = dice[1]
    dice[1] = dice[0]
    dice[0] = dice[4]
    dice[4] = dice[5]
    dice[5] = temp


def move_left():
    temp = dice[4]
    dice[4] = dice[0]
    dice[0] = dice[1]
    dice[1] = dice[5]
    dice[5] = temp


def move_front():
    temp = dice[3]
    dice[3] = dice[0]
    dice[0] = dice[2]
    dice[2] = dice[5]
    dice[5] = temp


def move_back():
    temp = dice[5]
    dice[5] = dice[2]
    dice[2] = dice[0]
    dice[0] = dice[3]
    dice[3] = temp


def simulate(num):
    global x, y
    dx = dxs[num - 1]
    dy = dys[num - 1]
    nx = x + dx
    ny = y + dy
    if 0 <= nx < n and 0 <= ny < m:
        x = nx
        y = ny
        if num == 1:
            move_right()
        elif num == 2:
            move_left()
        elif num == 3:
            move_back()
        elif num == 4:
            move_front()
        if board[x][y] == 0:
            board[x][y] = dice[0]
        else:
            dice[0] = board[x][y]
            board[x][y] = 0
        print(dice[5])


if __name__ == "__main__":
    n, m, x, y, k = map(int, input().split())
    board = []
    dice = [0] * (6)  # down, left, front,back,right, up
    for _ in range(n):
        board.append(list(map(int, input().split())))
    dxs = [0, 0, -1, 1]  # 동, 서, 북,남
    dys = [1, -1, 0, 0]
    command = list(map(int, input().split()))
    for i in range(k):
        simulate(command[i])
728x90
반응형

댓글