Algorithm/baekjoon

주사위 굴리기

마닐라 2022. 2. 21. 16:34

📍 문제 설명

 

💡 접근

십자 모양의 주사위지만 주사위의 숫자를 담는 일차원 배열을 사용해서 방향에 따라 전개도에 맞는 숫자가 들어가도록 하였음

 

 

1. 위와 같이 동서북남에 따라 방향에 맞게 주사위의 값을 변경시켜준다.

2. 이동한 칸의 수에 따라 조건에 맞는 처리를 해준다.

 

👩‍💻 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n, m, v, e, k, r, x, y, answer, cnt;
    static int[] arr, dice;
    static long[] dp;
    static int[][] board, result;
    static boolean[][] visited;
    static int[] dx = {0,0,-1,1};
    static int[] dy = {1,-1,0,0};
    static ArrayList<Integer> list;
    static StringBuilder sb;
    static Queue<Integer> q;
    public static void main(String[] args) throws IOException {
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        x = Integer.parseInt(st.nextToken());
        y = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        //지도에 쓰여있는 수
        board = new int[n][m];
        //주사위에 쓰여있는 숫자
        dice = new int[7];
        for(int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j < m; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        //주사위 이동시키는 명령
        arr = new int[k];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < k; i++) arr[i] = Integer.parseInt(st.nextToken());

        sb = new StringBuilder();

        T.solution();
        System.out.println(sb);

    }

    private void solution() {
        //주사위 k번 굴리기
        for(int i = 0; i < k; i++) {
            //해당 방향으로 주사위 이동
            int nx = x + dx[arr[i]-1];
            int ny = y + dy[arr[i]-1];

            if(nx<0 || ny<0 || nx>=n || ny>=m) continue;

            //해당 방향으로 주사위 굴리기
            changeDice(arr[i]);

            //이동한 칸의 쓰인 수가 0이면 주사위 바닥면에 쓰여있는 수가 칸에 복사
            if(board[nx][ny] == 0) {
                board[nx][ny] = dice[6];
            }
            //이동한 칸의 쓰인 수가 0이 아니면 칸에 쓰여있는 수가 주사위 바닥면으로 복사되고 칸은 0이됨
            else {
                dice[6] = board[nx][ny];
                board[nx][ny] = 0;
            }
            
            x = nx;
            y = ny;
            sb.append(dice[1]).append("\n");
        }
    }

    public static void changeDice(int direction) {
        int[] clone = dice.clone();
        // 1은 윗면 6은 바닥면
        // 동서북남
        if (direction == 1) {
            dice[1] = clone[4];
            dice[3] = clone[1];
            dice[4] = clone[6];
            dice[6] = clone[3];
        } else if (direction == 2) {
            dice[1] = clone[3];
            dice[3] = clone[6];
            dice[4] = clone[1];
            dice[6] = clone[4];
        } else if (direction == 3) {
            dice[1] = clone[5];
            dice[2] = clone[1];
            dice[5] = clone[6];
            dice[6] = clone[2];
        } else {
            dice[1] = clone[2];
            dice[2] = clone[6];
            dice[5] = clone[1];
            dice[6] = clone[5];
        }
    }


    private static class Point implements Comparable<Point> {
        private int x;
        private int y;
        private int crush;

        public Point(int x, int y, int crush) {
            this.x = x;
            this.y = y;
            this.crush = crush;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "x=" + x +
                    ", y=" + y +
                    ", crush=" + crush +
                    '}';
        }

        @Override
        public int compareTo(Point o) {
            return this.crush - o.crush;
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

컨베이어 벨트 위의 로봇  (0) 2022.02.23
드래곤커브  (0) 2022.02.21
배열 돌리기 1  (0) 2022.02.21
배열 돌리기 3  (0) 2022.02.20
알고스팟  (0) 2022.02.20