둘셋 개발!

[알고리즘] 주사위 굴리기 - 구현 본문

알고리즘

[알고리즘] 주사위 굴리기 - 구현

23 2022. 10. 24. 23:08

✏️ 문제:

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

 

✏️ 풀이:

- 주사위가 동, 서, 남, 북 으로 이동할 때, 각 방향마다 주사위의 각 면의 위치가 어떻게 바뀌는지는 고정이므로 배열에 어떤 위치가 어떻게 변하는지 미리 설정해놓는다. 예를 들어 주사위가 동쪽으로 이동하면, 항상 주사위 윗 면은 주사위의 오른쪽 면, 주사위의 아래면은 주사위의 왼쪽면, 주사위의 앞면은 그대로 주사위 앞면이 된다. 이처럼 방향마다 바뀌는 주사위 각 면의 위치의 값을 미리 설정한다.

 

✏️ 놓친 부분:

파이썬의 문법을 놓쳤다.

arr1=[0,1,2,3]

arr2 = arr1

이렇게 하면 arr1과 arr2가 가리키는 배열의 시작 위치가 같다.

따라서 arr1.append(4)를 하게 되면

 arr2 = [0,1,2,3,4]로 된다.

 

나는 같은 시작위치를 가리키는 것이 아니라 다른 배열이 생성되는 줄 알고 있었다.

 

✏️ 코드:

dice=[0,0,0,0,0,0]  # 주사위
dm = [[2,3,1,0,4,5],[3,2,0,1,4,5],[5,4,2,3,0,1],[4,5,2,3,1,0]] # direction Method

n ,m ,x, y, k= map(int,input().split()) # 지도세로, 가로, 현재위치 x, y, 명령의 갯수
road=[[0]*m for _ in range(n)] # 지도 초기화

for i in range(n): # 지도의 각 칸 입력
  road[i] = list(map(int,input().split()))

order = list(map(int,input().split())) # 방향 명령

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

for i in range(k):
  order_direct = order[i]-1  # 0~3
    
  nx = x + dx[order_direct]
  ny = y + dy[order_direct]

  # 지도를 벗어나는지 확인
  if nx<0 or nx>=n or ny<0 or ny>=m: 
    continue
  x = nx
  y = ny
  
  dice_copy = dice[:] #원본 copy
  for i in range(6): # 굴림
    num = dm[order_direct][i]
    dice[i] = dice_copy[num]

  
  # 지도에 있는 숫자 밑면을 copy
  if road[x][y]==0:
    road[x][y] = dice[1]
  else:
    dice[1] = road[x][y] 
    road[x][y]=0

  print(dice[0])