STUDY/Algorithm

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

sinawi95 2021. 10. 17. 14:15
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

# https://www.acmicpc.net/problem/14499
import sys; input = sys.stdin.readline

def rollingDice(d, dice):
    # d: rolling direction 1 east, 2 west, 3 north, 4 south
    # dice: 1 top, 6 bottom
    # return upper position
    tmp_dice = dice[:]
    if d == 1:
        tmp_dice[1] = dice[4]
        tmp_dice[3] = dice[1]
        tmp_dice[4] = dice[6]
        tmp_dice[6] = dice[3]
    elif d == 2:
        tmp_dice[1] = dice[3]
        tmp_dice[3] = dice[6]
        tmp_dice[4] = dice[1]
        tmp_dice[6] = dice[4]
    elif d == 3:
        tmp_dice[1] = dice[5]
        tmp_dice[2] = dice[1]
        tmp_dice[5] = dice[6]
        tmp_dice[6] = dice[2]
    elif d == 4:
        tmp_dice[1] = dice[2]
        tmp_dice[2] = dice[6]
        tmp_dice[5] = dice[1]
        tmp_dice[6] = dice[5]

    return tmp_dice

def changeCommand(command):
    # 동서남북 -> dx, dy
    dx, dy = None, None
    if command == 1:
        dx, dy = 0, 1
    elif command == 2:
        dx, dy = 0, -1
    elif command == 3:
        dx, dy = -1, 0
    elif command == 4:
        dx, dy = 1, 0
    return dx, dy

N, M, x, y, K = map(int, input().split())
_map = [[-1 for _ in range(M + 2)]]
for _ in range(N):
    _map.append([-1] + list(map(int, input().split())) + [-1])
_map.append([-1 for _ in range(M + 2)])
command = list(map(int, input().split()))


x += 1
y += 1
dice = [0 for _ in range(7)]  # 0 은 사용하지 않고 1~6 까지 사용
upper = 1
lower = 6
for c in command:
    dx, dy = changeCommand(c)
    if _map[x + dx][y + dy] == -1:
        continue
    x += dx
    y += dy
    dice = rollingDice(c, dice)
    if _map[x][y]:
        dice[6] = _map[x][y]
        _map[x][y] = 0
    else: # 지도의 값이 0 인 경우
        _map[x][y] = dice[6]
    print(dice[1])

삼성 a형 기출문제이다. 구현문제인데 주사위 굴리는걸 구현하는것에서 많이 애먹었다.

index로 계속 바꿔가면서 하려고했는데 구현하는데 너무 오래걸려서 타인의 코드를 보았다. 

dice에서 1을 윗면, 6을 아랫면으로 고정시켜서 주사위를 굴릴때마다 각 값들을 교환하는 방식으로 구현하면 조금더 쉽게 구현할수 있었다. 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 18258 큐2 C  (0) 2021.11.29
[백준] 1987 알파벳 python(pypy), c  (0) 2021.10.26
[백준] 9205 맥주 마시면서 걸어가기  (0) 2021.10.14
[백준] 3190 뱀 python  (0) 2021.10.14
[백준] 12865 평범한 배낭 python  (0) 2021.10.12