https://www.acmicpc.net/problem/23288
23288번: 주사위 굴리기 2
크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼
www.acmicpc.net
✅ Solution
- 14499 주사위 굴리기 문제에 조건을 좀 더 추가한 구현 문제이다.
- 참고 : [14499 주사위 굴리기] - https://ye0nn.tistory.com/61
- 문제를 읽으면서 차례대로 구현하면 된다.
- k번만큼 주사위를 굴린다.
- 이때, 만약 이동방향에 칸이 없다면 반대 방향으로 굴린다. 이 부분은 원래 방향의 값에 -1을 곱해준 값을 더해주면 된다.
- 그리고 방향을 바꿔줘야 한다.
- 예를 들어, 동쪽으로 굴렸는데 칸이 없다면 서쪽으로 다시 굴린 후, 현재 방향을 서쪽으로 바꿔주기!
- 처음에 그냥 이동만 시키고 방향을 안 바꿔줘서 틀렸었다.
- 그리고 지도의 값과 주사위 값을 비교해 이동방향을 바꿔준다. 이건 인덱스 값으로 처리했다.
- 다음으로 점수를 구했다.
- 점수는 bfs를 이용하여 이동 가능한 칸 값이 초기 값 (주사위를 이동시켰을 때의 지도 값)과 같으면 더해준다.
✅ Code
from collections import deque
def get_score(score, x, y):
# 똑같은 곳을 다시 더하지 않기 위해 배열 추가
visited = [[False] * m for _ in range(n)]
queue = deque()
queue.append((x, y))
visited[x][y] = True
score_sum = 0
while queue:
x, y = queue.popleft()
score_sum += score
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
if data[nx][ny] == score:
queue.append((nx, ny))
visited[nx][ny] = True
return score_sum
def turn(direction, x, y):
global dice
# 동쪽
if direction == 0:
dice = [dice[3], dice[1], dice[0], dice[5], dice[4], dice[2]]
# 남쪽
elif direction == 1:
dice = [dice[1], dice[5], dice[2], dice[3], dice[0], dice[4]]
# 서쪽
elif direction == 2:
dice = [dice[2], dice[1], dice[5], dice[0], dice[4], dice[3]]
# 북쪽
else:
dice = [dice[4], dice[0], dice[2], dice[3], dice[5], dice[1]]
if dice[-1] > data[x][y]:
direction = (direction + 1) % 4
elif dice[-1] < data[x][y]:
direction = (direction - 1) % 4
return direction
n, m, k = map(int, input().split())
data = [list(map(int, input().split())) for _ in range(n)]
answer = 0
# 동 남 서 북
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
dice = [1, 2, 3, 4, 5, 6]
x, y, direction = 0, 0, 0
for _ in range(k):
nx = x + dx[direction]
ny = y + dy[direction]
# 이동방향에 칸이 없을 때
if 0 > nx or nx >= n or 0 > ny or ny >= m:
nx = x + dx[direction] * (-1)
ny = y + dy[direction] * (-1)
direction = (direction + 2) % 4
# 주사위 굴리고 방향 다시 설정
direction = turn(direction, nx, ny)
# 점수 계산
answer += get_score(data[nx][ny], nx, ny)
x, y = nx, ny
print(answer)