1. 다음에 가려는 방향과 좌표를 체크
2. 가려는 방향과 좌표가 존재하면 주사위를 굴리고 경우에따라 수를 복사
# 처음 주사위 모든 면은 0
#
# - 주사위를 굴렸을 때 이동한 칸에 쓰여있는 수가
# ㄴ 0 이다 : 주사위의 바닥면에 있듣 수가 칸에 복사됨
# ㄴ 0 이 아니다 : 칸에 쓰인 수가 주사위 바닥에 복사되고, 칸의 수는 0 이 됨
# 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다
# - 주사위가 이동했을때마다 상단에 쓰인 값을 출력
from collections import deque
import copy
# 방향에 따라 주사위 굴리기
def move_dice(arr, dir):
arr = copy.deepcopy(arr)
if dir == 1:
arr[1].appendleft(arr[3].pop())
arr[3] = deque([arr[1].pop()])
elif dir == 2:
arr[1].append(arr[3].pop())
arr[3] = deque([arr[1].popleft()])
elif dir == 3:
arr[0].append(arr[1][1])
arr[3].append(arr[0].popleft())
arr[2].append(arr[3].popleft())
arr[1][1] = arr[2].popleft()
elif dir == 4:
arr[2].append(arr[1][1])
arr[3].append(arr[2].popleft())
arr[0].append(arr[3].popleft())
arr[1][1] = arr[0].popleft()
return arr
# 움직여야하는 방향과 방향에 따른 x, y 좌표값
def set_dir(x, y, dir):
dx = [0, 0, 0, -1, 1]
dy = [0, 1, -1, 0, 0]
nx, ny = x + dx[dir], y + dy[dir]
if 0 <= nx < n and 0 <= ny < m:
return nx, ny, dir
else:
return None, None, None
if __name__ == '__main__':
n, m, x, y, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
dirs = map(int, input().split())
dice = [deque([0]), deque([0, 0, 0]), deque([0]), deque([0])]
# 가려는 방향과 좌표를 찾는다.
for dir in dirs:
nx, ny, dir = set_dir(x, y, dir)
# 가려는 방향이 존재하면 주사위를 굴리고 수를 복사
if dir:
score = board[nx][ny]
dice = move_dice(dice, dir)
if board[nx][ny] == 0:
board[nx][ny] = dice[3][0]
else:
dice[3][0] = board[nx][ny]
board[nx][ny] = 0
x, y = nx, ny
print(dice[1][1])
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
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[Python] 백준 19237번 - 어른상어 (0) | 2022.09.25 |
---|---|
[Python] 백준 23291번 - 어항정리 (0) | 2022.09.24 |
[Python] 백준 23288번 - 주사위 굴리기2 (1) | 2022.09.21 |
[Python] 백준 17140번 - 이차원배열과연산 (1) | 2022.09.21 |
[Python] 백준 19236번 - 청소년 상어 (1) | 2022.09.16 |