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
주사위의 윗부분을 0, 옆면은 왼쪽부터 앞쪽 방향으로 1, 2, 3, 4, 바닥 부분을 5로 둔다. 주사위를 주어진 방향에 따라 굴렸을 경우 위 그림에 맞게 면을 수정해준다.
N, M, x, y, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
move = list(map(int, input().split()))
mv = [[0, 0], [0, 1], [0, -1], [-1, 0], [1, 0]] # x, y # move: 1~4
dice = [0, 0, 0, 0, 0, 0] # 위, 왼, 앞, 오른, 뒤, 아래
def roll(d): # 주사위를 굴린다. 위 그림 참고
global dice
d0, d1, d2, d3, d4, d5 = dice
if d == 1: # 동
dice = [d1, d5, d2, d0, d4, d3]
elif d == 2: # 서
dice = [d3, d0, d2, d5, d4, d1]
elif d == 3: # 북
dice = [d2, d1, d5, d3, d0, d4]
elif d == 4: # 남
dice = [d4, d1, d0, d3, d5, d2]
else:
raise ValueError
return dice
if board[x][y] != 0: # 주사위가 있는 위치의 지도 값이 0 이 아니라면
dice[-1] = board[x][y] # 주사위의 가장 마지막 원소가 바닥 면의 숫자이다.
board[x][y] = 0 # 주사위에 복사 후 지도는 0으로 수정
for d in move:
nx, ny = x + mv[d][0], y + mv[d][1]
if 0 <= nx < N and 0 <= ny < M: # 다음 위치로 이동 가능하다면
dice = roll(d) # 주사위를 굴리고
if board[nx][ny] == 0: # 지도가 0이라면
board[nx][ny] = dice[-1] # 주사위 바닥 면의 숫자 복사
else: # 0이 아니라면
dice[-1] = board[nx][ny] # 주사위 밑면에 지도의 수 복사
board[nx][ny] = 0 # 지도는 0으로
print(dice[0]) # 윗면 출력
x, y = nx, ny # 다음 위치로 이동
'알고리즘 > 백준' 카테고리의 다른 글
[백준 파이썬] 21610 마법사 상어와 비바리기 (0) | 2023.08.01 |
---|---|
[백준 파이썬] 21608 상어 초등학교 (0) | 2023.07.31 |
[백준 파이썬] 17140 이차원 배열과 연산 (0) | 2023.07.29 |
[백준 파이썬] 15685 드래곤 커브 (0) | 2023.07.28 |
[백준 파이썬] 15683 감시 (0) | 2023.07.27 |