백준(BOJ) 14499 주사위 굴리기 파이썬(Python)

문제 링크

간단한 시뮬레이션 구현 문제.
까다로운 부분은 주사위가 굴러감에 따라서 윗면과 바닥면의 위치가 바뀌는 부분인데, 그냥 하드코딩해도 충분하다.
임의로 dice[0]부터 dice[5]를 각각 원래 상태의 윗면, 북쪽 면, 바닥면, 남쪽 면, 서쪽 면, 동쪽 면으로 정했다.
주사위(정확히는 주사위가 없어서 네모난 지우개)를 돌려 가면서 각 면이 어떤 면으로 변하는지 확인해보면 된다.
그 다음에는 지시사항을 따르면 충분하다.

#!python

n, m, x, y, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
command = list(map(int, input().split()))

# direction[i]는 커맨드가 i일 때 이동해야 하는 (x값, y값, (주사위 값 튜플))
# 예를 들어 direction[4][2][0]은 방향이 4(남쪽)일 때 주사위의 0번 면에 1번의 값이 들어가는 것을 의미한다.
direction = ((0, 0, 0), (0, 1, (4, 1, 5, 3, 2, 0)), (0, -1, (5, 1, 4, 3, 0, 2)), (-1, 0, (3, 0, 1, 2, 4, 5)), (1, 0, (1, 2, 3, 0, 4, 5)))
dice = [0 for _ in range(6)]

for c in command:
    dx, dy, dd = direction[c]

    # 범위를 넘어가는 경우 아무 값도 바꾸거나 출력하지 않고 넘어감
    if not (0 <= x + dx < n and 0 <= y + dy < m):
        continue

    # 주사위 돌리기
    # 임시 변수를 만들어 새로운 주사위의 상태를 저장한 후 옮긴다
    temp = [0 for _ in range(6)]
    for i in range(6):
        temp[i] = dice[dd[i]]
    dice = temp[:]

    # 밑면 숫자 / 보드 숫자 바꾸기
    # 이후 이동에서는 갱신된 x, y값을 기준으로 해야 하므로 값을 갱신한다
    # dice[2]는 주사위의 바닥면을 의미한다
    x, y = x + dx, y + dy
    if board[x][y] == 0:
        board[x][y] = dice[2]
    else:
        dice[2] = board[x][y]
        board[x][y] = 0

    # 윗면 출력
    print(dice[0])

2024

맨 위로 이동 ↑

2023

세그먼트 트리

개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...

벨만-포드 알고리즘

개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...

다익스트라 알고리즘

개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...

맨 위로 이동 ↑