[14499] 주사위 굴리기 (골드 4)

isanghaessi·2022년 2월 3일
0

백준

목록 보기
5/10

14499번: 주사위 굴리기

주사위가 맵을 돌아다니면서 맵과 주사위의 숫자가 교환되는 법칙을 구현하는 문제이다.

고려했던 사항은 다음과 같다.

  • 움직일 때마다 위에서 보이는 주사위 숫자를 출력한다.
  • 주사위는 맵 밖으로 움직일 수 없고, 출력도 없어야 한다.
  • 밟은 맵의 숫자가 0이라면 주사위의 숫자가 맵으로 복사된다.
  • 밟은 맵의 숫자가 0이 아니라면 맵의 숫자가 주사위 아랫면으로 복사되고, 맵의 숫자가 0이된다.

풀이 과정은 다음과 같다.

  • 주사위 전개도를 저장할 배열을 만들고, 최신화한다.
  • 맵의 숫자를 저장할 배열을 만들고, 최신화한다.
  • 주사위의 위치를 i, j로 가지고 있는다.
  • move함수를 통해서 주사위 전개도, 맵, 좌표 값, direction(동, 서, ...)를 받아서 실행한다.
    • 주사위 전개도, 맵, 좌표 값을 복사하여 받고 origin으로 저장해둔다.
    • 주사위 전개도, 맵을 최신화후에 주사위가 나간 경우라면 origin을 반환한다.
    • 잘 된 경우라면 현재 값을 반환한다.

문제에서 전개도 그림을 보여주면서 힌트를 준 문제였다. 그래도, 처음에는 입체적인 주사위를 어떻게 다뤄야할지 막막했다... 구현, 시뮬레이션 문제를 풀 때마다 느끼지만 문제를 정확히 읽는 능력이 정말 중요한 것 같다.

import sys

def move(diceMap, i, j, dice, direction):
  origin = ([dm[:] for dm in diceMap], i, j, [d[:] for d in dice])
  if direction == 1:
    j += 1
    dice[1][0], dice[1][1], dice[1][2], dice[3][1] = dice[3][1], dice[1][0], dice[1][1], dice[1][2]
  elif direction == 2:
    j -= 1
    dice[1][0], dice[1][1], dice[1][2], dice[3][1] = dice[1][1], dice[1][2], dice[3][1], dice[1][0]
  elif direction == 3:
    i -= 1
    dice[0][1], dice[1][1], dice[2][1], dice[3][1] = dice[1][1], dice[2][1], dice[3][1], dice[0][1]
  else:
    i += 1
    dice[0][1], dice[1][1], dice[2][1], dice[3][1] = dice[3][1], dice[0][1], dice[1][1], dice[2][1]
  if i < 0 or i >= n or j < 0 or j >= m:

    return origin
  if diceMap[i][j]  == 0:
    diceMap[i][j] = dice[3][1]
  else:
    dice[3][1] = diceMap[i][j]
    diceMap[i][j] = 0
  print(dice[1][1])

  return (diceMap, i, j, dice)

n, m, x, y, k = map(int, sys.stdin.readline().strip().strip().split(' '))
diceMap = [[] for _ in range(n)]
for _n in range(n):
  line = map(int, sys.stdin.readline().strip().strip().split(' '))
  for l in line:
    diceMap[_n].append(l)
dice = [[0 for _ in range(3)] for _ in range(4)]
i, j = x, y
directions = map(int, sys.stdin.readline().strip().strip().split(' '))
for direction in directions:
  diceMap, i, j, dice = move([dm[:] for dm in diceMap], i, j, [d[:] for d in dice], direction)
profile
seungyong HONG

0개의 댓글