알고리즘 문제 풀이

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
반응형