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

HL·2021년 3월 27일
0

백준

목록 보기
63/104
post-custom-banner

문제 링크

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

문제 설명

  • board, 주사위 굴리는 방향이 주어짐
  • 굴릴 때 바닥이 복사되고 지워지고 함
    • 처음엔 모두 0
  • 굴릴 때마다 윗 면의 번호 출력

풀이

그대로 구현

주사위 굴리기 구현

  • 길이가 7인 주사위 리스트 초기화
  • 예시의 각 면 숫자를 인덱스로 사용
  • 굴리는 방향으로 3번 swap

후기

  • 문제에서 주어지는 가로 크기, 세로 크기와 x, y 좌표가 정반대다
  • 왜 이렇지..

코드

def down():
    cy, cx = curr
    cy += 1
    if not (0 <= cy < h and 0 <= cx < w):
        return False
    curr[0], curr[1] = cy, cx
    swap(5, 6)
    swap(1, 5)
    swap(2, 1)
    if board[cy][cx] == 0:
        board[cy][cx] = dice[6]
    else:
        dice[6] = board[cy][cx]
        board[cy][cx] = 0
    return True


def up():
    cy, cx = curr
    cy -= 1
    if not (0 <= cy < h and 0 <= cx < w):
        return False
    curr[0], curr[1] = cy, cx
    swap(2, 1)
    swap(1, 5)
    swap(5, 6)
    if board[cy][cx] == 0:
        board[cy][cx] = dice[6]
    else:
        dice[6] = board[cy][cx]
        board[cy][cx] = 0
    return True


def right():
    cy, cx = curr
    cx += 1
    if not (0 <= cy < h and 0 <= cx < w):
        return False
    curr[0], curr[1] = cy, cx
    swap(1, 3)
    swap(4, 1)
    swap(6, 4)
    if board[cy][cx] == 0:
        board[cy][cx] = dice[6]
    else:
        dice[6] = board[cy][cx]
        board[cy][cx] = 0
    return True


def left():
    cy, cx = curr
    cx -= 1
    if not (0 <= cy < h and 0 <= cx < w):
        return False
    curr[0], curr[1] = cy, cx
    swap(1, 4)
    swap(3, 1)
    swap(6, 3)
    if board[cy][cx] == 0:
        board[cy][cx] = dice[6]
    else:
        dice[6] = board[cy][cx]
        board[cy][cx] = 0
    return True


def swap(i, j):
    tmp = dice[i]
    dice[i] = dice[j]
    dice[j] = tmp


# init
import sys
ipt = sys.stdin.readline
opt = sys.stdout.write
h, w, y, x, k = map(int, ipt().split())
board = [list(map(int, ipt().split())) for _ in range(h)]
orders = list(map(int, ipt().split()))
dice = [0] * 7
curr = [y, x]

# start
for order in orders:
    if order == 1:
        if right():
            opt(f'{dice[1]}\n')
    elif order == 2:
        if left():
            opt(f'{dice[1]}\n')
    elif order == 3:
        if up():
            opt(f'{dice[1]}\n')
    elif order == 4:
        if down():
            opt(f'{dice[1]}\n')
profile
Frontend 개발자입니다.
post-custom-banner

0개의 댓글