[C++] 백준 14499 : 주사위 굴리기

Kim Nahyeong·2022년 9월 8일
0

백준

목록 보기
136/157

#include <iostream>
#include <vector>

using namespace std;

int N, M, x, y, K;

int map[21][21];
vector<int> dice(7); // 주사위에 써 있는 수 - 배열 값 직접적으로 바꾸려면 vector 이용

// 지도 이동
int dx[5] = {0, 1, -1, 0, 0};
int dy[5] = {0, 0, 0, -1, 1};

int r = 0, c = 0; // 현재 주사위 위치

void move(int dir){
  switch(dir){
    // 동
    case 1 :
      dice = {0, dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]}; // 배열은 {}
      break;
    // 서
    case 2 :
      dice = {0, dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]};
      break;
    // 북
    case 3 :
      dice = {0, dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]};
      break;
    // 남
    case 4 :
      dice = {0, dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]};
      break;
  }
}

int main(){
  scanf("%d %d %d %d %d", &N, &M, &x, &y, &K);

  r = y;
  c = x;

  for(int i = 0; i < N; i++){
    for(int j = 0; j < M; j++){
      scanf("%d", &map[i][j]); // 지도 입력받기
    }
  }

  int k;
  // 이동하는 명령어 K개 - 동 1 서 2 북 3 남 4
  for(int i = 0; i < K; i++){
    scanf("%d", &k);

    // 주사위 이동
    int nr = r + dx[k];
    int nc = c + dy[k];

    // 지도 밖을 벗어나는 경우
    if(nr < 0 || nr >= M || nc < 0 || nc >= N){
      continue;
    }
    // 벗어나지 않는 경우
    r = nr; c = nc;

    move(k);

    // 칸 0 : 주사위 바닥면 수 칸에 복사
    // y가 배열 앞에 x가 뒤에
    if(map[c][r] == 0){
      map[c][r] = dice[6];
    } else {
      // 칸 숫자 : 칸의 수 주사위에 복사
      dice[6] = map[c][r];
      // 칸 수 0 됨
      map[c][r] = 0;
    }
    // 모든 경우에 출력 x 다이스가 이동한 경우에만
    printf("%d\n", dice[1]); // 다이스 제일 윗면 출력
  }

  return 0;
}

생각은 내가 해서 풀었다 야호!!! 멋져 발전하는 나~

  • 배열을 통째로 다시 재정의 할 때는 vector로 배열을 정의해서 사용하는게 좋다. for문 전부 다 돌리기 귀찮으니까.

  • x, y 구분을 헷갈리지 말자!!! 문제에는 r이 북쪽으로부터 떨어진 칸의 개수, c가 서쪽으로부터 떨어진 칸의 갯수를 뜻한다. 때문에 r = y, c = x다. 헷갈리면 안됨... 진짜 이거 파악하는게 제일 헷갈린다. y축이 아래로 퍼져나가기 때문에

0개의 댓글