본문 바로가기
알고리즘 문제풀이/백준

[백준 14499] 주사위 굴리기

by m2162003 2020. 12. 17.

 

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

구현문제

구현문제는 알고리즘이 어려운 건 아닌데 풀이를 생각하기가 빡세다

 

총 세 부분으로 나눠서 동작한다.

1. 좌표값이 이동

- 명령에 맞게 좌표값을 이동시킨다. 이 때 배열의 범위를 벗어나는지 체크하고 벗어난다면 움직이지 않는다.

2. 주사위 굴리기

- 명령에 맞게 주사위를 굴려서 주사위 배열을 변화시킨다.

3. 굴린 주사위의 바닥면과 지도 점수 값을 확인하여 값을 업데이트

지도값을 기준으로 지도값이 0이면 지도[x][y] = 주사위 바닥면

그렇지 않으면 주사위바닥면 = 지도[x][y]; 지도[x][y] = 0

 

 

1과 3은 쉽지만 2가 좀 까다롭다.

처음에 제시된 주사위 전개도를 중심으로 명령에 맞게 전개도를 바꾸어본다.

 

 

 

 

 

 

 

 

 

 

 

 

그리고 주사위 전개도를 배열에 옮겨서 dice[0]은 주사위 윗면,

dice[2]는 주사위 바닥면에 위치하게 만든다.

 

 

 

 

 

 

 

 

#include <stdio.h>
#include <algorithm>

using namespace std;

int n, m, x, y, k;
int arr[20][20];

int dirx[5] = {0, 0, 0, -1, 1};
int diry[5] = {0, 1, -1, 0, 0};
int dice[6] = {0, 0, 0, 0, 0, 0};

void RolltheDice(int order)
{
  if (order == 1)
  {
    swap(dice[0], dice[4]);
    swap(dice[2], dice[5]);
    swap(dice[4], dice[5]);
  }
  else if (order == 2)
  {
    swap(dice[0], dice[5]);
    swap(dice[2], dice[4]);
    swap(dice[4], dice[5]);
  }
  else if (order == 3)
  {
    int tmp = dice[3];
    for (int i = 2; i > -1; i--)
    {
      dice[i + 1] = dice[i];
    }
    dice[0] = tmp;
  }
  else if (order == 4)
  {
    int tmp = dice[0];
    for (int i = 1; i < 4; i++)
    {
      dice[i - 1] = dice[i];
    }
    dice[3] = tmp;
  }
}
int main(void)
{
  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", &arr[i][j]);
    }
  }
  for (int i = 0; i < k; i++)
  {
    int order;
    scanf("%d", &order);

    if (x + dirx[order] < 0 || y + diry[order] < 0 || x + dirx[order] > n - 1 || y + diry[order] > m - 1)
    {
      continue;
    }
    x += dirx[order], y += diry[order];

    RolltheDice(order);
    printf("%d\n", dice[0]);
    if (arr[x][y] == 0)
    {
      arr[x][y] = dice[2];
    }
    else
    {
      dice[2] = arr[x][y];
      arr[x][y] = 0;
    }
   
  }
  return 0;
}

 

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 15684] 사다리 조작  (0) 2020.12.17
[백준 14503] 로봇 청소기  (0) 2020.12.17
[백준 15686] 치킨 배달  (0) 2020.12.16
[백준 15683] 감시  (0) 2020.12.16
[백준 2012] 등수 매기기  (0) 2020.12.16

댓글