본문 바로가기

Coding test

[백준/14499/파이썬] 주사위 굴리기 - 구현


소스코드

# 입력받기
import sys
input = sys.stdin.readline
N,M,x,y,cmd = map(int,input().split())
board = []
for _ in range (N):
    board.append(list(map(int,input().split())))
direct = list(map(int,input().split()))

# 1:동 2:서 3:북 4:남 
dx = [0,0,0,-1,1]
dy = [0,1,-1,0,0]

# 상, 우, 앞
urf = [1,3,5]
dice = [0] * 7

def new_urf(direction, urf):
    u,r,f = urf[0],urf[1],urf[2]
    if direction == 1:
        urf = [7-r,u,f]
    elif direction == 2:
        urf = [r,7-u,f]
    elif direction == 3:
        urf = [f,r,7-u]
    elif direction == 4:
        urf = [7-f,r,u]
    return urf

for i in direct:
    x,y = x+dx[i], y+dy[i]
    # 범위 밖으로 넘어가면 무시
    if x < 0 or x >= N or y < 0 or y >= M :
        x,y = x-dx[i], y-dy[i]
        continue
    # 현재 구른 상태의 주사위
    urf = new_urf(i,urf)
    # board가 0이면 주사위 밑면에 있는 숫자가 복사 board[x][y] = dice[7-urf[0]]
    if board[x][y]==0:
        board[x][y] = dice[7-urf[0]]
        print(dice[urf[0]])
    # board가 0이 아니면 dice[7-urf[0]] = board[x][y] 고 board[x][y] = 0이 됨
    else:
        dice[7-urf[0]] = board[x][y]
        board[x][y] = 0
        print(dice[urf[0]])

설명

문제를 풀고자하는 생각은 다음과 같습니다.

  1. 범위 밖이면 무시하자
  2. 현재 주사위의 상태를 저장하자
  3. 주사위 밑면에 따른 조건을 반영하자

주사위가 움직이는데 어후 머리로 상상하면서 푸려고 하니 머리가 아프더라구요 :(

 

그래서 맨위, 맨오른쪽, 맨앞을 기준으로 갱신해나갔습니다. (up, right, front)

그리고 방향에 따라 주사위 자체를 이동시킵니다. (dx, dy)

그러다보면 끝입니다.

생각보다 쉬운 문제였어요 :)