문제
주사위만 구현할 수 있으면 되는 문제이다. 주어진 전개도가 힌트가 되는데, 전개도에서 가로줄, 세로줄을 각각 deque로 놓고 rotate한다고 생각하면 주사위 굴리기가 쉽게 구현된다. 다른것보다 전개도를 이용해 주사위를 구현하는것이 가장 핵심이 됐던 문제라고 생각한다.
from collections import deque
n,m,x,y,k = map(int,input().split())
board = []
for _ in range(n):
board.append(list(map(int,input().split())))
moves = list(map(int,input().split()))
class Dice:
def __init__(self,value):
self.row = deque([0]*4)
self.col = deque([0]*4)
self.set_bottom(value)
def rotate(self,ver,hor):
if hor != 0:
self.row.rotate(hor)
self.col[1],self.col[-1] = self.row[1],self.row[-1]
else:
self.col.rotate(ver)
self.row[1],self.row[-1] = self.col[1],self.col[-1]
def set_bottom(self, value):
self.row[-1] = value
self.col[-1] = value
def get_bottom(self):
return self.row[-1]
def get_top(self):
return self.row[1]
# 동 서 북 남
dRow = ['',0,0,-1,1]
dCol = ['',1,-1,0,0]
dice = Dice(board[x][y])
row,col = x,y
for move in moves:
nRow,nCol = row+dRow[move],col+dCol[move]
if 0 <= nRow < n and 0 <= nCol < m:
row, col = nRow, nCol
dice.rotate(dRow[move],dCol[move])
if board[row][col] == 0:
board[row][col] = dice.get_bottom()
else:
dice.set_bottom(board[row][col])
board[row][col] = 0
print(dice.get_top())
풀이 2
주사위는 위와 같이 deque, 그리고 전개도에서 윗면과 아랫면만 잘 싱크하면 된다. 클래스로 복잡하게 짤 필요 없이, 다음과 같이 구현 가능하다.
from collections import deque
N,M,x,y,K = map(int,input().split())
board = []
for _ in range(N):
board.append(list(map(int,input().split())))
# 동 서 북 남
dr = [0, 0, 0, -1, 1]
dc = [0, 1, -1, 0, 0]
# 주사위 전개도
hor_dice = deque([0,0,0,0])
ver_dice = deque([0,0,0,0])
loc_dice = [x,y]
board[x][y] = hor_dice[-1]
for dir in map(int,input().split()):
# 주사위 이동 (굴리기)
r,c = loc_dice
nr, nc = r + dr[dir], c + dc[dir]
if 0 <= nr < N and 0 <= nc < M:
loc_dice = [nr,nc]
# 수평 이동
if dir == 1 or dir == 2:
hor_dice.rotate(dc[dir])
ver_dice[1] = hor_dice[1]
ver_dice[-1] = hor_dice[-1]
# 수직 이동
else:
ver_dice.rotate(dr[dir])
hor_dice[1] = ver_dice[1]
hor_dice[-1] = ver_dice[-1]
# 숫자 복사
if board[nr][nc] == 0:
board[nr][nc] = hor_dice[-1]
else:
hor_dice[-1], board[nr][nc] = board[nr][nc], 0
ver_dice[-1] = hor_dice[-1]
print(hor_dice[1])
'PS > 백준' 카테고리의 다른 글
14503번 - 로봇 청소기 (0) | 2022.08.23 |
---|---|
14500번 - 테트로미노 (1) | 2022.08.23 |
12100번 - 2048(Easy) (0) | 2022.08.23 |
13460 - 구슬 탈출 2 (0) | 2022.08.20 |
3190번 - 뱀 (0) | 2022.08.08 |