14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

[그림1] 문제의 전개도와 상관없이 가운데 정육각형을 기준으로 한다.

주사위의 윗부분을 0, 옆면은 왼쪽부터 앞쪽 방향으로 1, 2, 3, 4, 바닥 부분을  5로 둔다. 주사위를 주어진 방향에 따라 굴렸을 경우 위 그림에 맞게 면을 수정해준다.

N, M, x, y, K = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
move = list(map(int, input().split()))

mv = [[0, 0], [0, 1], [0, -1], [-1, 0], [1, 0]] # x, y # move: 1~4
dice = [0, 0, 0, 0, 0, 0] # 위, 왼, 앞, 오른, 뒤, 아래


def roll(d): # 주사위를 굴린다. 위 그림 참고
    global dice
    d0, d1, d2, d3, d4, d5 = dice
    if d == 1: # 동
        dice = [d1, d5, d2, d0, d4, d3]
    elif d == 2: # 서
        dice = [d3, d0, d2, d5, d4, d1]
    elif d == 3: # 북
        dice = [d2, d1, d5, d3, d0, d4]
    elif d == 4: # 남
        dice = [d4, d1, d0, d3, d5, d2]
    else:
        raise ValueError
    return dice


if board[x][y] != 0: # 주사위가 있는 위치의 지도 값이 0 이 아니라면
    dice[-1] = board[x][y] # 주사위의 가장 마지막 원소가 바닥 면의 숫자이다.
    board[x][y] = 0 # 주사위에 복사 후 지도는 0으로 수정

for d in move:
    nx, ny = x + mv[d][0], y + mv[d][1] 
    if 0 <= nx < N and 0 <= ny < M: # 다음 위치로 이동 가능하다면
        dice = roll(d) # 주사위를 굴리고
        if board[nx][ny] == 0: # 지도가 0이라면
            board[nx][ny] = dice[-1] # 주사위 바닥 면의 숫자 복사
        else: # 0이 아니라면
            dice[-1] = board[nx][ny] # 주사위 밑면에 지도의 수 복사
            board[nx][ny] = 0 # 지도는 0으로
        print(dice[0]) # 윗면 출력
        x, y = nx, ny # 다음 위치로 이동

+ Recent posts