코딩,안되면 될때까지

[백준 14499번 - 주사위 굴리기]-파이썬 본문

백준/백준-파이썬

[백준 14499번 - 주사위 굴리기]-파이썬

soo97 2022. 3. 16. 14:28
728x90
반응형

solved.ac 난이도 :  GOLD4

백준 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

<풀이>-시뮬레이션(주사위 회전)

주사위를 회전시키는 부분을 구현하는것이 이문제의 핵심이다.

주사위의 정보를 저장하는 배열을 두가지 정의한다.(dice,temp)

dice : 주사위를 회전한 뒤의 정보를 저장하는 배열

temp : 주사위를 회전시키기 전의 정보를 저장하는 배열

  뒷면(0)  
왼쪽면(1) 윗면(2) 오른쪽면(3)
  앞면(4)  
  밑면(5)  

주사위의 전개도를 살펴보면 위와 같다. 각 위치에 고유번호를 부여한다.(뒷면-0, 왼쪽면(1) , 윗면(2), 오른쪽면(3) , 앞면(4), 밑면(5)

 

회전방향 : 1-동쪽, 2-서쪽, 3-북쪽, 4- 남쪽

 

주사위를 회전한뒤, 각각의 면이 존재하는 위치를 담은 배열(direction)을 만든다. 즉 초기 주사위의 위치는

(뒷면,왼쪽면,윗면,오른쪽면,앞면,밑면)=(0,1,2,3,4,5)라고 정의하면 

주사위를 남쪽으로 회전시킨 뒤 주사위의 위치는 (5,1,0,3,2,4)가 된다.

각 번호는 주사위의 면을 나타내고 인덱스는 각면의 해당 위치가 된다.

예를들어 위에서 밑면의 번호는 5라고 정의하였고 초기 배열을 보면 5의 인덱스는 5이다.

주사위를 남쪽으로 회전하게 되면 밑면이 뒷면으로 올라가므로 밑면(5)의 인덱스가 0이 됨을 알수 있다. 

따라서 direction 배열을 다음과 같이 정의한다.

direction = [(0,5,1,2,4,3),#동쪽회전,
            (0,2,3,5,4,1),#서쪽회전
            (2,1,4,3,5,0),#북쪽회전
            (5,1,0,3,2,4)]#님쪽회전

주사위를 회전하는 방법

orders : 주사위의 회전방향 결정

dice[idx] = temp[direction[orders-1][idx]]

->direction[orders-1] : orders가 4이면 남쪽회전이므로 direction 배열의 3번째 인덱스의 정보를 참조해야한다.

->direction[oreders-1][idx] : (idx=0이라고 가정)남쪽으로 회전했을경우 밑면(5번)이 초기상태와 다르게 0번 인덱스가 된다. (위설명 참조)

->따라서 temp[direction[orders-1][idx]] = temp[5]가 된다.

->즉, dice[0]이 temp[5]가 되면서 주사위의 회전이 이루어진다.

위 과정을 idx=0~idx=5까지 반복하면 된다. (주사위는 6개의 면으로 이루어졌으므로)

※주의※ : 문제에서는 회전방향이 1~4지만 배열에서는 0~3이므로 입력된 숫자에서 -1을 해줘야한다.

 

<코드>-파이썬

 

direction = [(0,5,1,2,4,3),#동쪽회전,
            (0,2,3,5,4,1),#서쪽회전
            (2,1,4,3,5,0),#북쪽회전
            (5,1,0,3,2,4)]#님쪽회전

dice = [0]*6
temp = [0]*6 #임시저장


def rotate_dice():
    for idx in range(6):
        dice[idx] = temp[direction[orders-1][idx]]

def copy_number(a,b,dice,graph):
    if graph[a][b] == 0:
        graph[a][b] = dice[5]
    else:
        dice[5] = graph[a][b]
        graph[a][b] = 0

n,m,x,y,k = map(int,input().split())
data = []
for _ in range(n):
    data.append(list(map(int,input().split())))
order = list(map(int,input().split()))
dx = [0,0,-1,1]
dy = [1,-1,0,0]

for orders in order:
    x = x+dx[orders-1]
    y = y+dy[orders-1]
    if x<0 or x>=n or y<0 or y>=m:
        x,y = x-dx[orders-1],y-dy[orders-1]
        continue
    for idx in range(6):
        temp[idx] = dice[idx]
    rotate_dice()
    copy_number(x,y,dice,data)
    print(dice[2])
728x90
반응형
Comments