728x90
https://www.acmicpc.net/problem/14499
문제를 처음보면 주사위의 전개도가 그려지는데, 이를 활용해서 풀었다.
먼저 전개도의 가로,세로를 저장해주었다.
2
4 1 3
5
6
문제처럼 위와같은 전개도가 있다면
4,1,3
2,1,5,6 을 큐로 저장해주었다.
두 배열을 dice_r,dice_c라고 생각해보자.
만약 위,아래로 움직인다면 단순히 2,1,5,6 의 앞이나 뒤를 떼서 반대편에 붙이기만 하면 된다.
왼쪽오른쪽으로 움직인다면 1,3,4 로 바꾸고 dice_c의 마지막 배열과 움직인 방향의 값을 바꿔줘야 한다.
만약 오른쪽으로 움직여서 3이 맨 아래숫자가 되었다면, 맨 위숫자는 4가되어야하기 때문
이렇게 주사위를 움직이는 함수를 만들고 보드에 놓고 움직이기만 하면 된다. 특히 해당 문제는 문제를 조금 꼼꼼히 읽어야 했다..
주사위는 0,0 에서 시작하고 주사위의 전개도는 모두 0으로 시작하며,
보드가 0이라면 주사위의 숫자를 복사하여 주고, 0이 아니라면 숫자를 주사위 밑면에 옮기고 0으로 만든다.
필자는 마지막 문장을 꼼꼼히 안봐서 조금 헤맸다.
import sys
from collections import deque
input = sys.stdin.readline
n,m,x,y,k = map(int,input().split())
board = [ list(map(int,input().split())) for _ in range(n)]
orders = list(map(int,input().split()))
dice_c = deque([0,0,0,0])
dice_r = deque([0,0,0])
dx = [0,0,0,-1,1]
dy = [0,1,-1,0,0]
def move(di):
if di == 1:
dice_r.append(dice_r.popleft())
dice_c[3],dice_r[2] = dice_r[2],dice_c[3]
dice_c[1] = dice_r[1]
elif di == 2:
dice_r.appendleft(dice_r.pop())
dice_c[3], dice_r[0] = dice_r[0], dice_c[3]
dice_c[1] = dice_r[1]
elif di == 3:
dice_c.appendleft(dice_c.pop())
dice_r[1] = dice_c[1]
elif di ==4:
dice_c.append(dice_c.popleft())
dice_r[1] = dice_c[1]
for order in orders:
nx,ny = x + dx[order] , y + dy[order]
if 0<=nx<n and 0<=ny<m:
move(order)
if board[nx][ny]:
dice_r[1] = board[nx][ny]
dice_c[1] = board[nx][ny]
board[nx][ny]=0
else:
board[nx][ny] = dice_r[1]
x,y = nx,ny
print(dice_c[3])
근데 다 풀고 생각하니까 굳이 가로,세로로 안나누고 주사위 6개공간의 배열을 잡은 뒤에 동작방향에 맞게 배열 안을 바꿔주는게 더 편했을꺼 같다.
728x90
'Python > 백준' 카테고리의 다른 글
14503_로봇청소기 (0) | 2022.06.27 |
---|---|
14502_연구소 (0) | 2022.06.26 |
3190_뱀 (0) | 2022.06.20 |
12100_2048(easy) (0) | 2022.06.19 |
13460_구슬탈출 2 (0) | 2022.06.18 |