본문 바로가기

Algorithm/BOJ

[BOJ] 14499. 주사위 굴리기

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

 

 

1. 해결방법

전형적인 시뮬레이션 문제이고, 1시간 정도 걸렸다.

이 문제에서 핵심 포인트는 주사위의 값을 리스트로 미리 초기값을 구하고, 주사위가 굴려질 때마다 동 서 남 북 위 아래의 위치 값을 새로 갱신해주면 된다.

dy, dx 동서남북 이동 배열은 문제에서 1, 2, 3, 4가 동서북남이라고 명시되어있으므로, 0번째 인덱스에 0을 추가로 설정해두어야 한다.

중요한 건 주사위 리스트이다.
처음 주사위는 6면이 다 0의 값을 가지고 있으므로 0이 6개로 이루어진 리스트를 초기 값으로 저장한다.
주사위가 1, 2, 3, 4에 맞게 굴려지면 동 서 남 북 위 아래가 바껴진다. 그때마다 주사위 리스트의 값을 새로 갱신해주어야 한다.

만약 direct가 4일 때, 기존의 동쪽면이 주사위가 굴려진 후에는 아래면으로 역할이 바꿔지는 것을 이해해야 한다.
위 말이 이해가 가면 갱신 방법과 초기 세팅이 중요한 문제에서 코드로 작성하는 것은 쉽게 해결할 수 있다.

 

 

2. 정답코드

import sys
input = sys.stdin.readline

# input
N, M, y, x, K = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(N)]
k_list = list(map(int, input().split()))


# main
dy, dx = (0, 0, 0, -1, 1), (0, 1, -1, 0, 0)
dice = [0] * 6


d = maps[y][x]

for direct in k_list:
    ny, nx = y + dy[direct], x + dx[direct]
    e, w, s, n, u, d = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]

    if 0 <= ny < N and 0 <= nx < M:
        # 주사위가 이동했으니 동 서 남 북 위 아래 인덱스 값을 변경
        if direct == 1:
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = u, d, s, n, w, e
        elif direct == 2:
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = d, u, s, n, e, w
        elif direct == 3:
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, w, d, u, s, n
        elif direct == 4:
            dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, w, u, d, n, s

        if maps[ny][nx] == 0:
            maps[ny][nx] = dice[5]
        else:
            dice[5] = maps[ny][nx]
            maps[ny][nx] = 0

        y, x = ny, nx
        print(dice[4])

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

[BOJ] 15685. 드래곤 커브  (0) 2022.10.31
[BOJ] 2636. 치즈  (1) 2022.10.31
[BOJ] 18808. 스티커 붙이기  (0) 2022.10.28
[BOJ] 15683. 감시  (0) 2022.10.27
[BOJ] 3190. 뱀  (0) 2022.10.24