본문 바로가기
문제 풀이/백준(BOJ)

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

by 희조당 2023. 3. 2.
728x90

https://www.acmicpc.net/problem/14499

 

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


💡 문제 풀이

기본적인 구현 문제이다. 

요구사항에 맞게만 구현하면 된다.

✔️ 느낀 점

최적의 코드를 짜고 싶었다. 하지만 알고리즘은 시간과의 싸움 아닐까..? 그냥 구현하는 게 맞는지 잘 모르겠단 고민이 들었다.

💻 코드

import sys ; input = sys.stdin.readline
UP, DOWN, LEFT, RIGHT = 3, 4, 2, 1
direction = {
    DOWN: (1,0),
    UP: (-1,0),
    LEFT: (0,-1),
    RIGHT: (0,1)
}

def turnDice(move):
    global dice
    if move == UP:
        tmp = dice[2]
        dice[2] = dice[1]
        dice[1] = dice[5]
        dice[5] = dice[6]
        dice[6] = tmp
    elif move == DOWN:
        tmp = dice[2]
        dice[2] = dice[6]
        dice[6] = dice[5]
        dice[5] = dice[1]
        dice[1] = tmp
    elif move == LEFT:
        tmp = dice[4]
        dice[4] = dice[1]
        dice[1] = dice[3]
        dice[3] = dice[6]
        dice[6] = tmp
    else:
        tmp = dice[3]
        dice[3] = dice[1]
        dice[1] = dice[4]
        dice[4] = dice[6]
        dice[6] = tmp

def changeDice(board):
    global dice
    if board[nx][ny] == 0:
        board[nx][ny] = dice[6]
    else:
        dice[6] = board[nx][ny]
        board[nx][ny] = 0

n, m, x, y, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
moves = list(map(int, input().split()))
dice = {i : 0 for i in range(1,7)}

for move in moves:
    nx = x + direction[move][0]
    ny = y + direction[move][1]
    
    if 0 > nx or n <= nx or 0 > ny or m <= ny: continue
    turnDice(move)
    changeDice(board)
    x = nx ; y = ny
    
    print(dice[1])

댓글