본문 바로가기

알고리즘 문제풀이/백준

백준(boj) 14499_주사위 굴리기 (파이썬, c++)

https://www.acmicpc.net/problem/14499

풀이


큐빙문제의 순한맛 버전이다.

정육각형을 하나 그려놓고 위에는0, 아래는 5, 앞은 1, 뒤는 4, 왼쪽은 3, 오른쪽은 2를 적는다.

이 정육각형을 굴렸을 때 어떤 곳으로 변하게 될지 테이블을 만들어서 풀어준다.

만약 오른쪽으로 굴리면,

위에 있는 칸(0)은 왼쪽 칸(3)이 되고

앞에 있는 칸(1)은 그대로 앞(1),

오른쪽에 있는 칸(2)은 위(0),

왼쪽에 있는 칸(3)은 아래(5),

뒤에 있는 칸(4)은 그대로 뒤(4),

아래에 있는 칸(5)은 오른쪽 칸(2)이 된다.

이를 테이블로 만들면 [3, 1, 0, 5, 4, 2]이고, 나머지 L, U, D도 각각의 위치가 어디로 변하는지 생각해서 만들면 된다.

움직이는 방향들이 주어지므로 각각의 움직임에 따라 테이블(change배열)을 이용하여 움직여준다.

지도도 다음 방향으로 넘어가는데(nx, ny 이용), 만약 지도에 적힌 수가 0이 아니면 움직인 주사위의 바닥 면(0)에 지도에 적힌 수를 적고, 지도의 값은 0으로 바꿔준다. 만약 0이라면 그곳에 움직인 주사위의 바닥 면(0)을 적는다. 단, 움직임이 지도 범위를 넘어갈 때는 해당 동작을 무시한다.

이렇게 이동할 때마다 주사위의 윗(5)면에 쓰여 있는 수를 출력한다.

python3

from sys import*
from collections import*
input = stdin.readline

change=[[3, 1, 0, 5, 4, 2],     #R
        [2, 1, 5, 0, 4, 3],     #L
        [1, 5, 2, 3, 0, 4],     #U
        [4, 0, 2, 3, 5, 1]]     #D
dd=[(0,1), (0,-1), (-1,0), (1, 0)]
n, m, x, y, k=map(int,input().split())
a=[]
for i in range(n):
   a.append(list(map(int,input().split())))
move_list = map(int,input().split())
dice = [0]*6
for d in move_list:
   d-=1            #인덱스 0부터 쓸꺼야
   dx, dy = dd[d]
   nx, ny = x+dx, y+dy
   if nx<0 or ny<0 or nx>n-1 or ny>m-1: continue
   temp=[]
   for i in range(6):
       temp.append(dice[change[d][i]])
   for i in range(6):
       dice[i] = temp[i]
   if a[nx][ny]:
       dice[5] = a[nx][ny]
       a[nx][ny] = 0
   else:
       a[nx][ny] = dice[5]
   print(dice[0])
   x, y = nx, ny

C++

#include<cstdio>
#include<vector>
using namespace std;

int change[4][6] ={{3, 1, 0, 5, 4, 2},
                  {2, 1, 5, 0, 4, 3},
                  {1, 5, 2, 3, 0, 4},
                  {4, 0, 2, 3, 5, 1}};
int dd[][2]={{0,1},{0,-1},{-1,0},{1,-0}};

int main(){
   int n, m, x, y, k;
   int a[20][20], move_list[1000];
   int dice[6] = {0, };
   scanf("%d %d %d %d %d", &n, &m, &x, &y, &k);
   for(int i=0; i<n; i++)
       for(int j=0; j<m; j++)
           scanf("%d", &a[i][j]);
   for(int i=0; i<k; i++)
       scanf("%d", &move_list[i]);
   for(int i=0; i<k; i++){
       int d, dx, dy, nx, ny;
       d = move_list[i]-1;
       dx = dd[d][0];
       dy = dd[d][1];
       nx = x+dx, ny = y+dy;
       if(nx<0 || ny<0 || nx>n-1 || ny>m-1) continue;
       vector<int> v;
       for(int i=0; i<6; i++){
           v.push_back(dice[change[d][i]]);
      }
       for(int i=0; i<6; i++){
           dice[i] = v[i];
      }
       if(a[nx][ny]){
           dice[5] = a[nx][ny];
           a[nx][ny]=0;
      }
       else{
           a[nx][ny] = dice[5];
      }
       printf("%d\n",dice[0]);
       x = nx, y = ny;
  }
   return 0;
}

고찰



.