알고리즘

백준 14499번 주사위 굴리기

cottoncover 2023. 4. 29. 10:26
728x90
반응형
SMALL

문제 설명

이번 문제는 주사위의 전개도가 주어지고, 주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때마다 상단에 쓰여있는 값을 구하는 문제입니다.

  • 지도의 각 칸에는 정수가 하나씩 쓰여 있습니다.
  • 주사위를 굴렸을 때, 이동하는 칸에 쓰여 있는 수가 0이면 주사위의 바닥면에 쓰여 있는 수가 칸에 복사됩니다.
  • 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 됩니다.
  • 주사위는 지도 바깥으로 이동시킬 수 없습니다. 만약 바깥으로 이동하려고하면 해당 명령을 무시해야하고, 출력도 하면 안 됩니다.

 

문제 풀이

아이디어

주사위 면

하늘을 바라보고 있는 면(0)동서남북(1,2,3,4)를 향하고 있는 면, 바닥에 닿는 면(5) 총 6개의 면이 존재합니다. 각 면에 인덱스를 붙여줍니다.

 

주사위 굴리기

이번 문제의 경우 주사위가 구르는 방향에 따라 각 면에 있는 숫자들이 이동하게 됩니다.

이동하는 방향(동서남북)에 따라 각 주사위 면이 이동하는 면을 모두 살펴봅니다.

 

동쪽으로 이동할 경우

  • 하늘(0)은 동쪽(1)로 이동합니다.
  • 동쪽(1)은 바닥(5)로 이동합니다.
  • 서쪽(2)은 하늘(0)로 이동합니다.
  • 바닥(5)은 서쪽(2)로 이동합니다.

서쪽으로 이동할 경우

  • 하늘(0)은 서쪽(2)로 이동합니다.
  • 동쪽(1)은 하늘(0)로 이동합니다.
  • ...

주사위가 이동할 때마다 위와 같은 방식으로 면이 움직이게 됩니다.

주사위가 이동할 때마다 면의 숫자들을 새로운 면의 숫자로 바꿔주면 됩니다.

 

풀이

이동 시 새로운 면에 숫자 주입

이동할 때마다 주사위의 각 면의 숫자를 바꿔주면 됩니다.

def roll(dice,direction):
    if direction==1:
        dice[0],dice[1],dice[2],dice[5]=dice[1],dice[5],dice[0],dice[2]
    elif direction==2:
        dice[0],dice[1],dice[2],dice[5]=dice[2],dice[0],dice[5],dice[1]
    elif direction==3:
        dice[0],dice[3],dice[4],dice[5]=dice[3],dice[5],dice[0],dice[4]
    else:
        dice[0],dice[3],dice[4],dice[5]=dice[4],dice[0],dice[5],dice[3]
    return dice

direction은 1:동쪽, 2:서쪽, 3:북쪽, 4:남쪽 입니다.

이전 면에 해당하는 숫자를 새로운 면에 대입해주는 것을 알 수 있습니다.

 

주사위 이동

주사위가 이동할 때, 바깥으로 나간다면 이동 명령을 따르지도 않고, 출력도 하지 않습니다.

주사위가 나가지 않는다면 주어진 방향대로 이동시키고, 주사위면의 숫자들도 이동한 면에 대입해줍니다. 그 다음, 하늘을 바라보는 면의 숫자를 출력해줍니다.

 

 

해결

이번 문제는 구현 문제로, 차근차근 풀어냈던 것 같습니다.

 

문제 링크 : 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

코드 링크 : https://github.com/beomseok37/baekjoon/blob/master/new!/14499.py

반응형
LIST