[백준 문제] 14499번 주사위 굴리기 (슬라이싱 이용)(파이썬)
코딩 프로세스 로직
- 한 주사위를 2개의 자료구조로 나눈다.
- 위 혹은 아래로 굴릴 경우, 오른쪽, 왼쪽면의 값은 바뀌지 않으니, [윗면, 앞면, 아랫면, 뒷면] 만 고려하면 된다.(dice_ud)
- 오른 혹 왼쪽으로 굴릴 경우, 앞면, 뒷면의 값은 바뀌지 않으므로, [윗면, 오른면, 아랫면, 왼면] 만 고려하면 된다. (dice_rl)
- dice_ud : [윗면, 앞면, 아랫면, 뒷면]
- dice_rl : [윗면, 오른면, 아랫면, 왼면]
- dice_di : 동, 서, 남, 북으로 움직일 때,
- directions : 돌릴 방향을 담는다.(1 : 앞/오른, -1 : 뒤/왼)
dice_ud = [0, 0, 0, 0]
dice_rl = [0, 0, 0, 0]
dice_di = [1, -1, -1, 1] # 동 서 북 남
dxs = [0, 0, -1, 1] # ex. 1:동 - (0,1) ... 4:남 (1, 0)
dys = [1, -1, 0, 0]
n, m, x, y, k = list(map(int, input().split()))
board = [list(map(int, input().split())) for _ in range(n)]
commands = list(map(int, input().split()))
for command in commands:
# 다음 이동 좌표의 범위 체크
nx, ny = x + dxs[command - 1], y + dys[command - 1]
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
x, y = nx, ny
# 이동하는 방향이 위 아래인지, 오른, 왼쪽인지 확인한다.
if command in [1, 2]:
direction = dice_di[command - 1]
# 슬라이싱으로 방향 지정
dice_rl = dice_rl[direction:] + dice_rl[:direction]
# 주사위 상태를 이전에 둘로 나누었으므로, 동기화 시켜줘야 한다. (위, 아래만 같도록)
dice_ud[0], dice_ud[2] = dice_rl[0], dice_rl[2]
elif command in [3, 4]:
direction = dice_di[command - 1]
dice_ud = dice_ud[direction:] + dice_ud[:direction]
dice_rl[0], dice_rl[2] = dice_ud[0], dice_ud[2]
# (1) 이동한 칸이 0인 경우 : 주사위 바닥면(dice_ud[2])을 복사.
# (2) 이동한 칸 0이 아닌 경우 : 주사위에 복사되고 바닥면은 0
if board[x][y] == 0:
board[x][y] = dice_ud[2]
else:
dice_ud[2] = dice_rl[2] = board[x][y]
board[x][y] = 0
# 윗면을 출력한다.
print(dice_ud[0])