본문 바로가기
알고리즘

백준_14499_주사위 굴리기(시뮬레이션)

by 매화of사군자 2020. 2. 25.

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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

해결 방법

> 딱히 알고리즘을 사용하는 문제가 아니라 문제이해를 잘하면 되는 문제이다.

> 입력을 받을때 n, m, x, y, k 순으로 입력을 받는데 문제 조건 중에 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1)로 보아 입력을 받는 x, y는 각각 y와 x로 바꾸어 문제를 푸는것이 더 헷갈리지 않는다.

> 나머지는 주사위를 굴릴때 주사위 면이 어떻게 변하는지만 잘 체크하면 된다.

 

코드

더보기

import copy

 

n,m,y,x,k = map(int,input().split())

board = [list(map(int,input().split())) for i in range(n)]

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

 

dice = [0,0,0,0,0,0]

 

def checkBoard(x,y):

    if x >= len(board[0]) or y >= len(board) or x < 0 or y < 0:

        return True

    else:

        return False

 

def rolldice(dice,i):

    tmp_dice = copy.deepcopy(dice)

    if i == 1:  #동

        dice[-1] = tmp_dice[2]

        dice[2] = tmp_dice[0]

        dice[0] = tmp_dice[3]

        dice[3] = tmp_dice[-1]

    elif i == 2:    #서

        dice[-1] = tmp_dice[3]

        dice[3] = tmp_dice[0]

        dice[0] = tmp_dice[2]

        dice[2] = tmp_dice[-1]

    elif i == 3:    #북

        dice[0] = tmp_dice[4]

        dice[4] = tmp_dice[-1]

        dice[-1] = tmp_dice[1]

        dice[1] = tmp_dice[0]

    else:   #남

        dice[0] = tmp_dice[1]

        dice[1] = tmp_dice[-1]

        dice[-1] = tmp_dice[4]

        dice[4] = tmp_dice[0]

 

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

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

 

def check(x,y,dice,i):

    x += dx[i - 1]

    y += dy[i - 1]

    if checkBoard(x,y):

        x -= dx[i - 1]

        y -= dy[i - 1]

        return x, y, dice, 0

    rolldice(dice,i)

    if board[y][x] == 0:

        board[y][x] = dice[-1]

    else:

        dice[-1] = board[y][x]

        board[y][x] = 0

    return x, y, dice, 1

 

for i in mission:

    if i == 1:  #동

        x, y, dice, flag = check(x,y,dice,i)

        if flag == 1:

            print(dice[0])

    elif i == 2:    #서

        x, y, dice, flag = check(x,y,dice,i)

        if flag == 1:

            print(dice[0])

    elif i == 3:    #북

        x, y, dice, flag = check(x,y,dice,i)

        if flag == 1:

            print(dice[0])

    else:   #남

        x, y, dice, flag = check(x,y,dice,i)

        if flag == 1:

            print(dice[0])

댓글