# 문제
백준 14499 주사위 굴리기 파이썬 풀이
# 코드
import copy
import sys
def print2D(arr) :
for i in arr :
print(i)
print()
RIGHT = 1
LEFT = 2
UP = 3
DOWN = 4
dirs = [
(-1,-1), (0,1), (0,-1),(-1,0),(1,0)
]
dice = [0,0,0,0,0,0]
# 지도크기, 좌표, 명령의 개수
N,M,x,y,K = map(int,sys.stdin.readline().split())
board = list()
for _ in range(N) :
line = list(map(int,sys.stdin.readline().split()))
board.append(line)
commands = list(map(int,sys.stdin.readline().split()))
# print2D(board)
# print(commands)
# 주사위를 굴렸을때
# 이동한 칸에 쓰여있는수가 0이면, 주사위 바닥면에 쓰여 있는 수가 칸에 복사된다.
# 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위 바닥면으로 복사된다. 칸에 쓰여 있는 수는 0이 된다.
def diceTop() :
global dice
return dice[1]
def diceBottom() :
global dice
return dice[3]
def rollDice(state):
global dice
beforeDice = copy.copy(dice)
if state == RIGHT :
dice[1] = beforeDice[4]
dice[5] = beforeDice[1]
dice[3] = beforeDice[5]
dice[4] = beforeDice[3]
if state == LEFT :
dice[1] = beforeDice[5]
dice[4] = beforeDice[1]
dice[3] = beforeDice[4]
dice[5] = beforeDice[3]
if state == UP :
dice[1] = beforeDice[2]
dice[0] = beforeDice[1]
dice[3] = beforeDice[0]
dice[2] = beforeDice[3]
if state == DOWN :
dice[1] = beforeDice[0]
dice[2] = beforeDice[1]
dice[3] = beforeDice[2]
dice[0] = beforeDice[3]
for command in commands :
dir = dirs[command]
if 0 <= x+dir[0] < N and 0<= y +dir[1] < M: # 이동 가능할때
x += dir[0]; y += dir[1]
rollDice(command)
if board[x][y] == 0 : # 이동한 칸의 바닥이 0 이면
board[x][y] = diceBottom()
else :
dice[3] = board[x][y]
board[x][y] = 0
print(diceTop())
# 풀이
주사위를 던질때(굴릴때) 주사위 안에 수를 이동시켜주는 로직만 짜면 끝이다.
해당 로직을 rolldice로 구현했는데, 알고리즘이 존재할거 같아서 생각해봤지만 떠오르지 않아서 하드코딩했다.
dice배열의 0~5번인덱스까지를 특정영역으로 정하고, L,R,U,D을 토대로 변화되게 해준다.
실행로직에서는 command를 입력 받고 해당 command로 주사위를 이동시킬 수 없으면 그냥 다음 커맨드로 넘기고, command동작이 가능하다면, 주사위를 굴리고, 바닥면의 조건에 따라서 주사위 또는 board판을 update시켜준다.
update가 끝났다면, diceTop()을통해 현재 dice의 맨 윗 부분을 반환해준다.
'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글
[백준14891&파이썬] 톱니바퀴를 돌릴때는 deque를 사용하자 (0) | 2023.06.17 |
---|---|
[백준14503&파이썬] 회전은 모듈러연산을 이용하자 (0) | 2023.06.17 |
[백준3190&파이썬] 스네이크게임은 deque로 구현이 가능하다. (0) | 2023.06.13 |
[백준1865&파이썬] 플로이드 와샬을 통해 음의 사이클 판단하기 (0) | 2023.06.10 |
[백준9935&파이썬] 리스트 슬라이싱은 느리다. 문자열문제는 스택을 생각해보자 (0) | 2023.06.08 |