출처 : https://www.acmicpc.net/problem/14499
풀이 방법
간단한 구현 문제이다.
각 주사위에서 저장된 수를 저장하기 위해 배열을 사용했다.
2, 4, 1, 3, 5, 6 순서로 저장했다.
그리고 주사위가 굴려졌을 때 어떻게 주사위의 눈금이 변화되는지 생각해 각 함수를 작성했다.
여기서 중요한 포인트는 주사위가 밖으로 나갔을 때 무시해야 하는 것이다.
이때 만약 주사위를 먼저 굴리고 주사위를 이동시킨 후 좌표를 체크하고 롤백하게 된다면 주사위의 상하좌우가 변하기 때문에
주사위의 좌표를 체크를 먼저 하고 난 후 주사위가 밖으로 나가지 않은 경우 주사위를 굴려야 한다.
N, M, y, x, cnt = map(int, input().split())
board = []
dice = [0, 0, 0, 0, 0, 0] ## 위에서 부터 오른쪽에서 부터 주사위 전개도를 따라 저장
dy = [0, 0, -1, 1]
dx = [1, -1, 0, 0]
## 주사위를 어떻게 관리할 것인지가 제일 중요할 듯
for i in range(N):
arr = list(map(int, input().split()))
board.append(arr)
command = map(int, input().split())
## 바닥에 0이면 주사위의 바닥 수가 바닥에 복사
## 바닥의 수가 주사위의 바닥에 복사되며 바닥의 수는 0으로 된다.
## 바닥 밖으로 나가는 경우 무시하며 출력도 하면 안된다.
## 주사위의 상단의 수를 출력 하자
def moveright():
a, b, c ,d = dice[1], dice[2], dice[3], dice[5]
dice[1], dice[2], dice[3], dice[5] = b, c, d, a
def moveleft():
a, b, c ,d = dice[1], dice[2], dice[3], dice[5]
dice[1], dice[2], dice[3], dice[5] = d, a, b, c
def moveup():
a, b, c, d = dice[0], dice[2], dice[4], dice[5]
dice[0], dice[2], dice[4], dice[5] = d, a, b, c
def movedown():
a, b, c, d = dice[0], dice[2], dice[4], dice[5]
dice[0], dice[2], dice[4], dice[5] = b, c, d, a
for c in command:
y += dy[c-1]
x += dx[c-1]
if x < 0 or x >= M or y < 0 or y >= N: ## 보드 밖을 벗어나는 경우
y -= dy[c-1]
x -= dx[c-1]
continue
if c == 1: ## 동쪽 오른 쪽으로 이동
moveright()
elif c == 2: ## 서쪽 왼 쪽으로 이동
moveleft()
elif c == 3: ## 복쪽 위 쪽으로 이동
moveup()
elif c == 4: ## 남쪽 아래 쪽으로 이동
movedown()
if board[y][x] == 0:
board[y][x] = dice[2]
print(dice[5])
else:
ground = board[y][x]
dice[2] = ground
board[y][x] = 0
print(dice[5])
'Algorithm' 카테고리의 다른 글
[백준] 회장뽑기 2660번 (C++) bfs (0) | 2024.09.13 |
---|---|
[백준] 톱니바퀴 14891번 (python) 구현 (1) | 2024.09.08 |
[백준] 내려가기 2096번 (python) 원도우를 활용한 DP (0) | 2024.08.31 |
[백준] RGB거리 2 17404번 (python) DP 무조건적인 선택 (0) | 2024.08.23 |
[백준] 암호 코드 2011번 (python) DP (0) | 2024.08.18 |