본문 바로가기
알고리즘/삼성

[백준-골드4] 14499번 주사위 굴리기 (구현, 파이썬)

by 호리미 2022. 4. 12.

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

 

<문제 요약>

  - N * M 지도에 한칸에 하나씩 0 - 9 숫자가 써있다. 처음 주사위의 위치 x, y와 이동 명령 수 k 가 입력으로 주어짐

  - 주사위 전개도에서 1이 윗면, 3이 동쪽을 바라보는 상태로 놓여있고, 가장 처음 주사위의 모든 면에 0이 적혀있음

  - 명령으로 주어진 방향으로 주사위를 굴리면서 한칸씩 이동 해야함

  - 주사위가 이동하는 칸이 0이면 그 칸에 주사위의 바닥면에 쓰여 있는 수가 복사됨.

  - 주사위가 이동하는 칸이 0이 아니면 칸에 쓰여있는 수가 주사위 바닥면으로 복사되고, 그 칸은 0이 됨

  - 이 때 지도 범위를 벗어나서 이동하려는 경우에는 명령을 무시함

  - 명령은 1:동쪽, 2:서쪽, 3:북쪽, 4:남쪽으로 주어짐

 

<주사위 설명>

   - 문제에서 요구하는대로 주사위를 접으면 우측 입체도와 같다.

   - 여기서 방향은 바라보고 있는 방향

초기 주사위

 

   - 주사위 전개도를 1차원 리스트로 변경시키고, 1-6번까지 초기 주사위 리스트를 기준으로 회전 했을 때 변화

   - 이동 방향이 주어지고 그 방향으로 주사위를 굴리면 해당면은 바닥으로 가고 상태가 변한다.

   - 머릿 속으로 차근차근 생각해볼것,,, 도형 시러 ㅠ

 

 

<내 코드>

  - rolling_dice(d) 함수 : 이동 방향을 입력으로 받아서 주사위 상태를 그 방향으로 굴렸을 때로 변화시킴

    - 위 주사위 1차원 리스트를 참고해서 위치를 변경했다.

  - 이동 명령 수행

    - 이동 방향으로 nx, ny를 설정한다.

    - 이 때, 범위를 벗어나지 않는 경우 rolling_dice 함수를 호출해서 주사위 상태를 변화 시킨다.

    - 만약 이동할 칸이 0이면 이동할 칸에 주사위 바닥면을 복사한다.

    - 그렇지 않은 경우, 해당 칸의 숫자를 주사위 바닥면에 대입하고, 해당 칸은 0이 된다.

    - 이동한 경우에 주사위 윗면 출력, x, y를 현재 위치로 업데이트한다.

 

import sys
import copy
input = sys.stdin.readline

n, m, x, y, k = map(int , input().split())
maps = []
for _ in range(n):
    maps.append(list(map(int, input().split())))
orders = list(map(int, input().split()))

# 동, 서, 북, 남 순서
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

dice = [0]*6 #주사위 상태 나타내는 리스트

def rolling_dice(d):

    temp = copy.deepcopy(dice)
    if d == 1: # 동쪽으로 굴렸을 때
        # 주사위 상태 변경
        dice[0] = temp[3]
        dice[2] = temp[0]
        dice[3] = temp[5]
        dice[5] = temp[2]

    elif d == 2: # 서쪽으로 굴렸을 때
        # 주사위 상태 변경
        dice[0] = temp[2]
        dice[2] = temp[5]
        dice[3] = temp[0]
        dice[5] = temp[3]

    elif d == 3: # 북쪽으로 굴렸을 때
        dice[0] = temp[4]
        dice[1] = temp[0]
        dice[4] = temp[5]
        dice[5] = temp[1]

    else: # 남쪽으로 굴렸을 때
        dice[0] = temp[1]
        dice[1] = temp[5]
        dice[4] = temp[0]
        dice[5] = temp[4]

for d in orders:
    nx = x + dx[d-1]
    ny = y + dy[d-1]

    if 0<=nx<n and 0<=ny<m: # 범위 체크
        rolling_dice(d)
        if maps[nx][ny] == 0: # 지도의 칸이 0이면 주사위 바닥면 복사
            maps[nx][ny] = dice[5] #주사위 바닥면
        else:
            dice[5] = maps[nx][ny]
            maps[nx][ny] = 0 #칸에 쓰인 숫자 0됨
        print(dice[0])  # 이동 후 주사위 윗면 출력

        x, y = nx, ny # 이동한 경우에만 현재 위치 x, y 업데이트