백준 알고리즘
[백준/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])