문제 풀이/백준 문제풀이

[백준11047 - Java] 구현 - 주사위 굴리기

공부하고 기억하는 공간 2024. 4. 23. 16:40
728x90
반응형
SMALL

 

주사위 굴리기

 

풀이

  1. 문제 파악
  • 필요한 기능
    • 이동
      • 이동시에는 지도 밖으로 나가는지 확인해야 하는 조건 필요
      • 이동 시 주사위 배열의 위치를 변경시켜줘야 함
    • 바닥면 복사
      • 바닥이 0 일 경우 주사위의 바닥면을 바닥에 복사
      • 바닥이 0 이 아닐경우 바닥의 수를 주사위 바닥면에 복사 후 바닥의 값은 0으로 변경
  1. 변수 생성
    • 지도 생성에 필요한 변수
    • 현재 위치 변수
    • 주사위 오더 횟수 변수
    • 동서남북 이동시 필요한 x,y 이동 배열 변수
    • 주사위 배열 변수
    public static int n,m,x,y,k;
            public static int[][] map;
    
            //동,서,북,남
            public static int[] dx = {0,0,-1,1};
            public static int[] dy = {1, -1, 0, 0};
    
            //윗,바,앞,뒤,왼,오
            public static int[] dice = {0, 0, 0, 0, 0, 0};
  1. 코드 구현
    package Simulation;
    
    import java.io.*;
    import java.util.*;
    
    public class SimulationP14499 {
            public static int n,m,x,y,k;
            public static int[][] map;
    
            //동,서,북,남
            public static int[] dx = {0,0,-1,1};
            public static int[] dy = {1, -1, 0, 0};
    
            //윗,바,앞,뒤,왼,오
            public static int[] dice = {0, 0, 0, 0, 0, 0};
        public static void main(String[] args) throws IOException {
            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());
            map = new int[n][m];
            for (int i = 0; i < n; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < m; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }
    
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < k; i++) {
                int move = Integer.parseInt(st.nextToken())-1;
                x += dx[move];
                y += dy[move];
                if (x < 0 || x >= n || y < 0 || y >= m) {
                    x -=dx[move];
                    y -= dy[move];
                    continue;
                }
    
                switch (move) {
                    case 0:
                        move_right();
                        break;
                    case 1:
                        move_left();
                        break;
                    case 2:
                        move_up();
                        break;
                    case 3:
                        move_down();
                        break;
                }
    
                //바닥면 복사
                if (map[x][y] == 0) {
                    map[x][y] = dice[1];
                }else{
                    dice[1] = map[x][y];
                    map[x][y] = 0;
                }
    
                System.out.println(dice[0]);
    
            }
        }
    
        private static void move_down() {
            // 윗 -> 앞 -> 바 -> 뒷 -> 윗
            int temp = dice[0];
            dice[0] = dice[3];
            dice[3] = dice[1];
            dice[1] = dice[2];
            dice[2] = temp;
        }
    
        private static void move_up() {
            // 윗 -> 뒷 -> 바 -> 앞 -> 윗
            int temp = dice[0];
            dice[0] = dice[2];
            dice[2] = dice[1];
            dice[1] = dice[3];
            dice[3] = temp;
        }
    
        private static void move_left() {
            // 윗 -> 왼 -> 바 -> 오 -> 윗
            int temp = dice[0];
            dice[0] = dice[5];
            dice[5] = dice[1];
            dice[1] = dice[4];
            dice[4] = temp;
        }
    //    //윗,바,앞,뒤,왼,오
    //    public static int[] dice = {0, 0, 0, 0, 0, 0};
        public static void move_right() {
            int temp = dice[0];
            dice[0] = dice[4];
            dice[4] = dice[1];
            dice[1] = dice[5];
            dice[5]  = temp;
        }
    
    }
    
    

 

728x90
반응형
SMALL