2016_하_1_L12

Nitroblue 1·2025년 8월 18일

삼성 기출 풀이

목록 보기
3/73

정육면체 굴리기

Simulation

평균 138'
Sol : 44'

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

EAST = 1
WEST = 2
NORTH = 3
SOUTH = 4

rolls = list(map(int, input().split()))

# grid를 벗어나는 시도는 무시하며, 출력도 하지 않는다.
# 이동할 때마다 정육면체의 상단 면에 쓰여져 있는 숫자를 출력하라.

cube = [0, 0, 0, 0, 0, 0]
# 정육면체 각 면 매직 넘버 부여
U, F, D, B, R, L = 0, 1, 2, 3, 4, 5


def roll(direction):
    global x, y
    if direction == EAST:
        temp = cube[L]
        cube[L] = cube[D]
        cube[D] = cube[R]
        cube[R] = cube[U]
        cube[U] = temp
        # 주사위 위치 업데이트
        y += 1
    if direction == WEST:
        temp = cube[U]
        cube[U] = cube[R]
        cube[R] = cube[D]
        cube[D] = cube[L]
        cube[L] = temp
        # 주사위 위치 업데이트
        y -= 1
    if direction == SOUTH:
        temp = cube[B]
        for s in range(3, 0, -1):
            cube[s] = cube[s-1]
        cube[U] = temp
        x += 1
    if direction == NORTH:
        temp = cube[U]
        for b in range(3):
            cube[b] = cube[b+1]
        cube[B] = temp
        x -= 1
    return cube[U]

# 해당 방향으로 굴릴 수 있는가?
def can_roll(direction, cube_x, cube_y):
    if direction == EAST:
        if cube_y + 1 < m:
            return True
    if direction == WEST:
        if cube_y - 1 >= 0:
            return True
    if direction == SOUTH:
        if cube_x + 1 < n:
            return True
    if direction == NORTH:
        if cube_x - 1 >= 0:
            return True
    return False

# 주사위 굴린 후 cube[D]와 맵 간의 상호작용
def update():
    if grid[x][y] == 0:
        grid[x][y] = cube[D]
    else:
        cube[D] = grid[x][y]
        grid[x][y] = 0


# 굴릴 수 있는가 > 굴린 후 cube[U]는 출력, cube[D]는 맵과 상호작용.
for i in range(k):
    if can_roll(rolls[i], x, y):
        roll(rolls[i])
        update()
        print(cube[U])

0개의 댓글