백준 알고리즘

[백준/Python] 14499_주사위 굴리기

헝그리개발자 2021. 6. 25. 16:10

문제

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

풀이

구현 문제입니다.

주사위를 굴렸을 때 회전축이 지나는 2개의 면을 제외한 4개의 면이 어떻게 변하는지 이해한다면 풀 수 있는 문제입니다.

면 \ 회전 방향
1(윗면) 1 -> 4 1 -> 3 1 -> 5 1 -> 2
2(북쪽 면) 그대로 그대로 2 -> 1 2 -> 6
3(동쪽 면) 3 -> 1 3 -> 6 그대로 그대로
4(서쪽 면) 4 -> 6 4 -> 1 그대로 그대로
5(남쪽 면) 그대로 그대로 5 -> 6 5 -> 1
6(아랫면) 6 -> 3 6 -> 4 6 -> 2 6 -> 5

입력받은 이동 명령 순서대로 주사위를 회전시키고 지도를 벗어나지 않는다면, 주사위 바닥과 지도의 값을 비교하여 주사위의 윗면의 값을 출력합니다.

코드

import sys


def move_dice(direction):
    if direction == 1:  # 동
        dice[1], dice[3], dice[4], dice[6] = dice[4], dice[1], dice[6], dice[3]
    elif direction == 2:  # 서
        dice[1], dice[3], dice[4], dice[6] = dice[3], dice[6], dice[1], dice[4]
    elif direction == 3:  # 북
        dice[1], dice[2], dice[5], dice[6] = dice[5], dice[1], dice[6], dice[2]
    elif direction == 4:  # 남
        dice[1], dice[2], dice[5], dice[6] = dice[2], dice[6], dice[1], dice[5]


n, m, y, x, k = map(int, sys.stdin.readline().rstrip().split())  # y: 행, x: 열
arr = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(n)]
orders = list(map(int, sys.stdin.readline().rstrip().split()))
dice = [0 for _ in range(7)]  # [0, 위, 북, 동, 서, 남, 아래]

dy = [0, 0, 0, -1, 1]  # [0, 동, 서, 북, 남]
dx = [0, 1, -1, 0, 0]

for i in orders:
    if 0 <= y + dy[i] < n and 0 <= x + dx[i] < m:
        y = y + dy[i]
        x = x + dx[i]
        move_dice(i)
        if arr[y][x] != 0:
            dice[6] = arr[y][x]
            arr[y][x] = 0
        else:
            arr[y][x] = dice[6]
        print(dice[1])