[Python] 백준 / gold / 14499 : 주사위 굴리기

김상우·2021년 12월 21일
0
post-custom-banner

문제 링크 : https://www.acmicpc.net/problem/14499

시뮬레이션 문제. 주사위를 굴렸을 때 면들의 위치가 뒤바뀌는 것을 어떻게 구현하느냐가 관건이었다. 먼저 전개도에서 봤을 때 마주보는 면의 인덱스 합은 7이라는 것을 파악해야 했다. 주사위를 동, 서, 남, 북으로 굴리는 것을 어떻게 코딩으로 구현해야 하나 고민하다 꽤 마음에 드는 풀이를 생각했다.

주사위의 윗면 (top) , 동쪽면 (east), 남쪽면 (south) 3개만 항상 파악해주면 건너편은 7 - index 로 구할 수 있다.

앞으로도 주사위 관련 문제가 나오면, 3개의 면을 다루면서 풀면 될 것 같다.


파이썬 코드

import sys
N, M, x, y, K = map(int, sys.stdin.readline().split())
graph = []

for i in range(N):
    graph.append(list(map(int, sys.stdin.readline().split())))

cmd = list(map(int, sys.stdin.readline().split()))

dice = [-1, 0, 0, 0, 0, 0, 0] # default, 1~6
top = 1
east = 3
south = 5
direction = [(0, 0), (0, 1), (0, -1), (-1, 0), (1, 0)]  # default, 동, 서, 북, 남

for c in cmd:
    nx = x + direction[c][0]
    ny = y + direction[c][1]

    # 맵 안의 범위에서.
    if 0 <= nx < N and 0 <= ny < M:
        # 굴러간다
        t, e, s = top, east, south
        # 동
        if c == 1:
            top = 7 - e
            east = t
            south = s
        # 서
        elif c == 2:
            top = e
            east = 7 - t
            south = s
        # 북
        elif c == 3:
            top = s
            east = e
            south = 7 - t
        # 남
        elif c == 4:
            top = 7 - s
            east = e
            south = t

        bottom = 7 - top
        # 이동한 칸이 0 이면
        if graph[nx][ny] == 0:
            graph[nx][ny] = dice[bottom]
        # 이동한 칸이 0이 아니면
        else:
            dice[bottom] = graph[nx][ny]
            graph[nx][ny] = 0

        x = nx
        y = ny
        print(dice[top])

    # 바깥으로 나갈 경우
    else:
        continue
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.
post-custom-banner

0개의 댓글