주사위 굴리기

yonii·2021년 10월 16일
0

🔗문제 링크

구현 코드

package BOJ;
import java.util.*;
public class 주사위굴리기 {
    static int[] dice = new int[7];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(); //지도 세로
        int m = in.nextInt(); //지도 가로
        int dice_x = in.nextInt();
        int dice_y = in.nextInt(); //주사위 x,y좌표
        int k = in.nextInt(); //명령의 개수

        int[][] map = new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                map[i][j] = in.nextInt();
            }
        }

        int[] instruction = new int[k];
        for(int i=0;i<k;i++){
            instruction[i] = in.nextInt();
        }

        //동 서 북 남
        int[] dy = {1,-1,0,0};
        int[] dx = {0,0,-1,1};
        for(int i=0;i<k;i++){
            int dir = instruction[i];
            int next_x = dice_x+dx[dir-1];
            int next_y = dice_y+dy[dir-1];
     
            if(next_x>=0 && next_x<n && next_y>=0 && next_y<m){
                dice_x = next_x;
                dice_y = next_y;
                roll(dir);
                if(map[next_x][next_y]==0){
                    map[next_x][next_y] = dice[1];
                }
                else{
                    dice[1] = map[next_x][next_y];
                    map[next_x][next_y] = 0;
                }
                System.out.println(dice[6]);
            }
        }

    }

    static void roll(int dir){
        int[] copy = dice.clone();
        switch (dir){
            case 1:{
                //동
                dice[4] = copy[1];
                dice[1] = copy[3];
                dice[3] = copy[6];
                dice[6] = copy[4];
                break;
            }
            case 2:{
                //서
                dice[4] = copy[6];
                dice[1] = copy[4];
                dice[3] = copy[1];
                dice[6] = copy[3];
                break;
            }
            case 3:{
                //남
                dice[2] = copy[6];
                dice[1] = copy[2];
                dice[5] = copy[1];
                dice[6] = copy[5];
                break;
            }
            case 4:{
                //북
                dice[2] = copy[1];
                dice[1] = copy[5];
                dice[5] = copy[6];
                dice[6] = copy[2];
                break;
            }
        }
    }
}
  • 알고리즘

    명령 for문 {
    현재 주사위 위치에서 해당 명령 방향으로 굴렸을 경우 다음 위치 구하기
    -> 다음 위치가 정해진 범위(지도크기)를 넘어갈 경우에는 다음 수행x
    -> 안넘어갈 경우에 주사위를 굴리고(주사위 값 바꿔주기), 출력 수행
    }

문제 자체는 시뮬레이션 문제라 크게 어렵지 않았는데 주사위를 굴릴때마다 달라지는 면들을 어떻게 바꿔줘야할지 감이 잘 안왔음.

가로 세로 따로 배열로 보고 굴릴 생각까지는 했는데 이게 굴린다고 생각하니까 너무 어렵게 느껴졌음. 밑에 글을 참고하니 그냥 붙은 면에 값만 바꿔준다는 식으로 이해하니까 잘 풀렸음.

참고

주사위 굴리기

profile
공부하려고 노력ing....

0개의 댓글