[백준 문제] 14499번 주사위 굴리기 (슬라이싱 이용)(파이썬)


[백준 문제] 14499번 주사위 굴리기 (슬라이싱 이용)(파이썬)

코딩 프로세스 로직

  • 한 주사위를 2개의 자료구조로 나눈다.
    • 위 혹은 아래로 굴릴 경우, 오른쪽, 왼쪽면의 값은 바뀌지 않으니, [윗면, 앞면, 아랫면, 뒷면] 만 고려하면 된다.(dice_ud)
    • 오른 혹 왼쪽으로 굴릴 경우, 앞면, 뒷면의 값은 바뀌지 않으므로, [윗면, 오른면, 아랫면, 왼면] 만 고려하면 된다. (dice_rl)
    • dice_ud : [윗면, 앞면, 아랫면, 뒷면]
    • dice_rl : [윗면, 오른면, 아랫면, 왼면]
    • dice_di : 동, 서, 남, 북으로 움직일 때,
    • directions : 돌릴 방향을 담는다.(1 : 앞/오른, -1 : 뒤/왼)
dice_ud = [0, 0, 0, 0]
dice_rl = [0, 0, 0, 0]
dice_di = [1, -1, -1, 1] # 동 서 북 남
dxs = [0, 0, -1, 1] # ex. 1:동 - (0,1) ... 4:남 (1, 0)
dys = [1, -1, 0, 0]
n, m, x, y, k = list(map(int, input().split()))
board = [list(map(int, input().split())) for _ in range(n)]

commands = list(map(int, input().split()))
for command in commands:

    # 다음 이동 좌표의 범위 체크
    nx, ny = x + dxs[command - 1], y + dys[command - 1]
    if nx < 0 or nx >= n or ny < 0 or ny >= m:
        continue
    x, y = nx, ny

    # 이동하는 방향이 위 아래인지, 오른, 왼쪽인지 확인한다.
    if command in [1, 2]:
        direction = dice_di[command - 1]
        # 슬라이싱으로 방향 지정
        dice_rl = dice_rl[direction:] + dice_rl[:direction]
        # 주사위 상태를 이전에 둘로 나누었으므로, 동기화 시켜줘야 한다. (위, 아래만 같도록)
        dice_ud[0], dice_ud[2] = dice_rl[0], dice_rl[2]

    elif command in [3, 4]:
        direction = dice_di[command - 1]
        dice_ud = dice_ud[direction:] + dice_ud[:direction]
        dice_rl[0], dice_rl[2] = dice_ud[0], dice_ud[2]

    # (1) 이동한 칸이 0인 경우 : 주사위 바닥면(dice_ud[2])을 복사. 
    # (2) 이동한 칸 0이 아닌 경우 : 주사위에 복사되고 바닥면은 0
    if board[x][y] == 0:
        board[x][y] = dice_ud[2]
    else:
        dice_ud[2] = dice_rl[2] = board[x][y]
        board[x][y] = 0

    # 윗면을 출력한다.
    print(dice_ud[0])





© 2018. by statssy

Powered by statssy