[BOJ] 14499 - 주사위 굴리기

김우경·2021년 1월 3일
1

삼성기출

목록 보기
4/37

문제 링크

주사위 굴리기

문제 설명

N*M크기의 지도가 있다. 지도의 위는 북쪽, 오른쪽은 동쪽이다. 좌표는 북쪽으로 r칸만큼 떨어졌고, 서쪽으로부터 c칸만큼 떨어졌을때 (r,c)와 같이 나타낸다.

주사위는 위와 같은 전개도로 구성되고, 초기 상태는 아래와 같다.

초기에 주사위는 x,y 좌표 위에, 주사위의 모든 면은 0이다.
지도의 각 칸에는 정수가 적혀있는데, 굴렸을때 이동한 보드의 칸이 0이면 주사위의 바닥면의 수->보드 칸으로 복사되고, 0이 아니면 보드 칸->주사위의 바닥면으로 복사되고 보드 칸은 0이 된다. 지도의 바깥으로 넘어가는 명령에 대해서는 명령을 무시하고 출력도 하지 않는다.
주사위가 이동했을 때 마다 상단에 쓰여 있는 값을 구하기

INPUT

  • 지도의 크기 N, M, 주사위 좌표 x y, 명령의 개수 K
  • 지도의 각 칸에 쓰여있는 수 (북쪽->남쪽, 각 줄은 서쪽->동쪽 순으로)
  • 이동하는 명령 (1:동, 2:서, 3:북, 4:남)

OUTPUT
매 이동시 마다 주사위 상단에 쓰여있는 값

문제 풀이

문제 설명이 좀 복잡하긴 하지만, 종이에 차근차근 써가면 구현 자체가 어려운 문제는 아니었다.
현재 주사위의 상태를 저장하기 위해 주사위의 윗면, 북쪽을 향하는 면, 동쪽을 향하는 면의 인덱스를 저장하고, 매 이동시마다 갱신해주었다. 나머지 주사위 면의 값이나 보드값에 대한 갱신은 문제에서 주어진 그대로 구현하였다.

import sys

input = sys.stdin.readline

dx = [0, 0, 0, -1, 1]
dy = [0, 1, -1, 0, 0]

N, M, x, y, K = map(int, input().split())
board = []
dice = [0]*7
opposite = {1:6, 2:5, 3:4, 4:3, 5:2, 6:1}
top, east, north = 1, 3, 2
answer = []

for i in range(N):
    board.append(list(map(int, input().split())))

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

def in_range(x, y):
    if x in range(N) and y in range(M):
        return True
    else:
        return False

for move in moves:
    #다음 칸으로 이동
    nx, ny = x+dx[move], y+dy[move]
    #지도를 벗어나면 해당 명령 무시하기
    if in_range(nx, ny) == False:
        continue

    #주사위 이동하기
    if move == 1:
        #동쪽이면
        top, east = opposite[east], top
    elif move == 2:
        #서쪽이면
        top, east = east, opposite[top]
    elif move == 3:
        # 북쪽이면
        top, north = opposite[north], top
    else:
        #남쪽이면
        top, north = north, opposite[top]

    if board[nx][ny] == 0:
        board[nx][ny] = dice[opposite[top]]
    else:
        dice[opposite[top]] = board[nx][ny]
        board[nx][ny] = 0
    x, y = nx, ny
    print(dice[top])


한방에 맞췄지롱

profile
Hongik CE

0개의 댓글