-
백준 14499번 주사위 굴리기알고리즘 2023. 4. 29. 10:26728x90반응형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
코드 링크 : https://github.com/beomseok37/baekjoon/blob/master/new!/14499.py
반응형LIST'알고리즘' 카테고리의 다른 글
백준 7576번 토마토 (2) 2023.06.26 백준 2252번 줄 세우기 (0) 2023.04.30 백준 10021번 Watering the Fields (0) 2023.04.14 백준 3190번 뱀 (4) 2023.04.13 백준 13460 구슬 탈출 2 (0) 2023.04.12