알고리즘 문제 풀이
146. [삼성기출42]Python 백준 23288 주사위 굴리기 2
코딩하는 덕구 🐶
2023. 9. 8. 14:09
728x90
반응형
안녕하세요 코딩하는 덕구입니다.
파이썬 백준 23288 주사위 굴리기 2 입니다.
https://www.acmicpc.net/problem/23288
23288번: 주사위 굴리기 2
크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼
www.acmicpc.net
문제 접근
주사위 구현이 가장 까다롭다.
이렇게 구현을 하고 주사위가 굴렀을 때 상, 하, 좌, 우, 앞, 뒤의 면이 어디서 오게되는지 생각했다.
dice = (1, 6, 4, 3, 5, 2) #상, 하, 좌, 우, 앞, 뒤
def roll_dice(d):
global dice
up, down, left, right, front, back = dice
if d == 0: #우
dice = (left, right, down, up, front, back)
elif d == 1: #하
dice = (back, front, left, right, up, down)
elif d == 2: #좌
dice = (right, left, up, down, front, back)
elif d == 3: #상
dice = (front, back, left, right, down, up)
Python 정답 코드
백준 23288 주사위 굴리기 2 코드입니다.
from collections import deque
N, M, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
dx = (0, 1, 0, -1)
dy = (1, 0, -1, 0)
dice = (1, 6, 4, 3, 5, 2) #상, 하, 좌, 우, 앞, 뒤
def roll_dice(d):
global dice
up, down, left, right, front, back = dice
if d == 0: #우
dice = (left, right, down, up, front, back)
elif d == 1: #하
dice = (back, front, left, right, up, down)
elif d == 2: #좌
dice = (right, left, up, down, front, back)
elif d == 3: #상
dice = (front, back, left, right, down, up)
def score(x, y):
visited = [[False for _ in range(M)] for _ in range(N)]
visited[x][y] = True
q = deque()
B = board[x][y]
C = 1
q.append((x, y))
while q:
x, y = q.popleft()
for d in range(4):
nx, ny = dx[d] + x, dy[d] + y
if 0 <= nx < N and 0 <= ny < M:
if not visited[nx][ny] and board[nx][ny] == B:
visited[nx][ny] = True
q.append((nx, ny))
C += 1
return B * C
def solve():
x, y = 0, 0
d = 0
ans = 0
for _ in range(K):
nx, ny = dx[d] + x, dy[d] + y
if not (0 <= nx < N and 0 <= ny < M):
d = (d + 2) % 4
x, y = dx[d] + x, dy[d] + y #move
roll_dice(d)
ans += score(x, y)
if dice[1] > board[x][y]:
d = (d + 1) % 4
elif dice[1] < board[x][y]:
d = (d + 3) % 4
return ans
print(solve())
백준 23288 주사위 굴리기 2 Python 코드였습니다.
감사합니다.
728x90
반응형